2010-04-21 88 views
10

我遇到一些麻煩了解IF子句從專業JavaScript的設計模式這一功能的結尾:JavaScript的繼承擴展功能

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; 
    } 
} 

書中解釋說,這些線路保證父類的構造函數屬性是正確的設置,即使超類是Object類本身。然而,如果我忽略那些三線並執行以下操作:

function SubClass() {}; 
extend(SubClass, Object); 

alert(Object.prototype.constructor == Object); 

警報說,「真」,這意味着父類的構造函數設置是否正確,即使沒有那最後三行。那麼,在什麼情況下,這個IF語句是否有用?

謝謝。

+0

我有一個問題:爲什麼中介函數F,而不是僅僅subClass.prototype =新超();? – 755 2013-02-19 10:00:37

回答

14

當更換一個構造函數的prototype屬性,例如,這兩個線儘量避免這個問題,一般是製備:

​​

functions objects are created,所述prototype屬性與一個新的對象初始化,其中包含一個constructor屬性,是指本身的功能,如:

function Bar() {}; 
var bar = new Bar(); 
bar.constructor === Bar; // true 

當您更換prototype與財產另一個對象,此對象具有自己的constructor屬性,通常從其他構造函數繼承,或從Object.prototype繼承。

var newObj = {}; 
newObj.constructor === Object; 

推薦的文章:

+1

這清除了我。謝謝。作者對此代碼的解釋具有誤導性。他們應該說,它確保超級類別本身沒有被不適當地擴展。 – Zach 2010-04-22 15:45:24