JavaScript原型继承和'new'关键字

我一直在玩JavaScript的原型继承,并且被new关键字的行为困惑。 我不明白为什么继承对象的[[prototype]]属性指向Function.prototype而不是继承对象的原型。 考虑2个构造函数(如下):

function Animal(name) {
    this.name = name;
}

function Cat(name) {
    Animal.call(this, name);
}

Cat.prototype = new Animal();

查询构造函数Cat的原型,我得到了一些有趣的结果:

Cat.__proto__ === Animal.prototype; //returns false -- shouldn't this be true?
Cat.__proto__ === Function.prototype; //returns true
Cat.prototype instanceof Animal; //returns true, as expected

我的理解是,当我们将它的原型属性设置为Animal一个新实例时, Cat[[prototype]]应该更新为指向Animal.prototype ,它应该

  • 基于Animal.prototype和。创建一个新的对象
  • 在内部将Cat.[[prototype]]Animal的外部原型属性?
  • 我已经在Chrome和FF中尝试了这一结果。 是什么赋予了?

    另外,当我们将Cat.prototype分配给一个new Animal()Cat.prototype应该是什么? 即:

    //if Cat.prototype = new Animal();
    //then
    Cat.prototype === Animal.prototype; //get false. Should this be true?
    

    Cat.__proto__ === Animal.prototype; //returns false -- shouldn't this be true?
    Cat.__proto__ === Function.prototype; //returns true
    

    Cat构造函数是一个函数。 因此,它从继承自Object.prototype Function.prototype继承。 Animal构造函数和所有其他函数对象也是如此。

    仅仅因为您分配给Cat.prototype不会改变Cat构造函数本身的继承链接(继承链接无论如何都是不可变的)。

    请注意, Cat实例不会从Cat继承,而是从Cat.prototype继承。 所以,你不关心Cat构造函数的原型链接。


    [[prototype]]属性由Object拥有,而不是由Constructor函数拥有。 所以在你的例子中,你会发现

    Cat.prototype.__proto__ === Animal.prototype; //Return true
    

    常见的说法

    Instance.__proto__ === Constructor.prototype; //Retrun true
    

    Cat是一个Function类型的构造函数,所以你看到了这个结果

    Cat.__proto__ === Function.prototype; //Return true 
    

    我的英语太可怕了,但我希望我已经解释了一些东西。 :-)

    链接地址: http://www.djcxy.com/p/30057.html

    上一篇: javascript prototypal inheritance and the 'new' keyword

    下一篇: Copying Javascript getters/setters to another prototype object