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

时间:2012-02-06 01:31:55

标签: javascript prototype prototypal-inheritance

我一直在玩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的新实例时,应该在本质

  1. 根据Animal
  2. 创建新对象
  3. 在内部设置Animal.prototypeCat.[[prototype]]的外部原型属性?
  4. 我已经在Chrome和FF中尝试了这个,结果相同。是什么给了什么?

    此外,当我们 Animal分配给Cat.prototype时,new Animal()应该是什么?即:

    Cat.prototype

2 个答案:

答案 0 :(得分:2)

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

Cat构造函数是一个函数。因此,它继承自Function.prototypeObject.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 

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