2012-10-02 34 views
2

這是專業的Javascript設計模式的extend定義,Apress出版,2008年,第44頁:爲什麼Javascript的擴展函數必須正確設置Object的原型構造函數?

function extend(subClass, superClass) { 
    var F = function() {}; 
    F.prototype = superClass.prototype; 
    subClass.prototype = new F(); 
    subClass.prototype.constructor = subClass; 

    subClass.superclass = superClass.prototype; 
    if(superClass.prototype.constructor == Object.prototype.constructor) { 
    superClass.prototype.constructor = superClass; 
    } 
} 

對於線subClass.superclass = superClass.prototype;,我想大概是同樣相同的,如果我們在做subClass.superclass = superClass,因爲未來,無論如何,我們總是可以通過subClass.superclass.prototype獲得原型。但我想爲什麼不指向構造函數,而是指向原型?但這是一個小問題。

更重要的問題是,爲什麼最後一行嘗試將對象的原型的構造函數設置回自己?我在Firefox和Chrome上嘗試過,他們總是這樣指出。

另外有點奇怪的是,爲什麼它使用if(superClass.prototype.constructor == Object.prototype.constructor)?爲什麼不使用if (superClass === Object)呢?

+0

構造函數屬性是使instanceof工作的原因。這是一個很好的細節,實際上並不常見。 –

+0

@MattGreer:錯了。 EcmaScript中'constructor'屬性沒有功能。 – Bergi

回答

2

subClass.superclass = superClass.prototype; 爲什麼不指向構造函數,而是指向原型?

兩者都可以完成,這只是一個設計問題。我想superClass財產是最重要的覆蓋方法,要調用他們的超級方法,他們可以通過調用this.constructor.superClass[methodName]。但是,是的,你需要constructor屬性有點奇怪,原型上的直接屬性會更容易一些。

更重要的問題是,爲什麼最後一行嘗試將Object的原型的構造函數設置回自己?

看起來這是爲了與不良原型聲明兼容而完成的。如果有人使用

MyClass.prototype = {…}; 

,並不會重置constructor,然後在extend(MySubClass, MyClass)superClass.prototype.constructorObject,並共同在MySubClass構造會失敗將父類的構造

this.constructor.superClass.constructor.apply(this, args); 
// for those who don't want to use MyClass.apply 

的。所以extend函數糾正這一點。

另外有點奇怪的是,爲什麼它使用if(superClass.prototype.constructor == Object.prototype.constructor)?爲什麼不使用if (superClass === Object)呢?

現在應該清楚爲什麼我們想要superClass.prototype.constructor。但是,是的,我們可以使用Object而不是Object.prototype.constructor

相關問題