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