2012-12-05 48 views
0

我看TUTS + OO JavaScript的訓練:他們做原型繼承的方式是這樣的:JavaScript的繼承(使用超功能時無限循環)

Employee.prototype = Object.create(Person.prototype); 

但爲什麼不能我做的只是(無對象創建)

Employee.prototype = Person.prototype; 

第二屆會給一個無限循環:http://jsfiddle.net/VMqSy/

爲什麼?控制檯登錄原型告訴我,1 Object.create()會給Employee.prototype 1 __proto__更多水平,這是Person.prototype,我覺得

+0

這兩條線有什麼區別? –

+0

你是不是指'Employee.prototype = Person.prototype;'(從小提琴)? –

回答

2

如果你這樣做(如圖小提琴)

Employee.prototype = Person.prototype; 

然後Employee將不會是Person的子類,而是它們將成爲相同的類(儘管有兩個不同的構造函數)。

更確切地說,您添加到Employee原型的方法和屬性對於任何Person也都可見。請注意,OOP中的類不應以任何方式影響其超類。


Employee.prototype = Object.create(Person.prototype); 

將創建一個新的對象,類似於

Employee.prototype = {}; 
Employee.prototype.__proto__ = Person.prototype 

除了Object.create(不像__proto__)在所有瀏覽器上運行,或以

Employee.prototype = new Person(); 

除外Person構造也可以將其他屬性設置爲Employee.prototypeObject.create將創建一個沒有額外屬性的對象。


在提琴無限循環發生,因爲Employee.prototype.sayHi電話​​,但Employee.prototype.sayHi​​,因此呼籲本身(當你分配給Employee.prototype.sayHi原​​丟失)。

如果Employee.prototype === Person.prototype那麼,必要時,Employee.prototype.sayHi === Person.prototype.sayHi