我一直在玩JavaScript的原型繼承,並已被new
關鍵字的行爲困惑。我不明白爲什麼繼承對象的[[prototype]]
屬性指向Function.prototype
而不是繼承對象的原型。考慮2個構造函數(如下圖):javascript原型繼承和'新'關鍵字
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
我的理解是,Cat
的[[prototype]]
應更新點到Animal.prototype
當我們將它的原型屬性設置爲Animal
的一個新實例時,應該本質上爲
- 創建一個新的對象基於
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.prototype = Object.create(Animal.prototype);' - 設置繼承。 – 2012-02-06 01:35:29
是的,我知道「物體」。創造()',但目標是學習'準系統'原型繼承的方法。 'Object.create()'是我的下一步。 – 2012-02-06 01:45:22
'X.prototype = new Y();'是有缺陷的,因爲'prototype'對象被分配給'Y'的新實例的屬性所污染。你想避免這種做法,並做它應該如何完成(通過'Object.create()')。 – 2012-02-06 02:09:09