我一直在玩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
我的理解是,[[prototype]]
的{{1}}应该更新为指向Cat
当我们将它的原型属性设置为Animal.prototype
的新实例时,应该在本质
Animal
和Animal.prototype
到Cat.[[prototype]]
的外部原型属性? 我已经在Chrome和FF中尝试了这个,结果相同。是什么给了什么?
此外,当我们将 Animal
分配给Cat.prototype
时,new Animal()
应该是什么?即:
Cat.prototype
答案 0 :(得分:2)
Cat.__proto__ === Animal.prototype; //returns false -- shouldn't this be true?
Cat.__proto__ === Function.prototype; //returns true
Cat
构造函数是一个函数。因此,它继承自Function.prototype
,Object.prototype
继承自Animal
。对于Cat.prototype
构造函数和所有其他函数对象也是如此。
仅仅因为你分配给Cat
并没有改变Cat
构造函数本身的继承链接(继承链接无论如何都是不可变的)。
请注意,Cat
个实例不会从Cat.prototype
继承,而是从Cat
继承。所以,你不关心{{1}}构造函数的原型链接。
答案 1 :(得分:0)
[[prototype]]属性由Object拥有,而不是由Constructor函数拥有。 所以在你的例子中,你会发现
Cat.prototype.__proto__ === Animal.prototype; //Return true
常见的说法
Instance.__proto__ === Constructor.prototype; //Retrun true
Cat是一个构造函数,它是函数类型的一个实例,所以你看到了这个结果
Cat.__proto__ === Function.prototype; //Return true
我的英语太可怕了,但我希望我已经解释了一些东西。 : - )