2015-08-16 96 views
3

在JavaScript中,如何訪問超類實例的屬性?作爲一個例子,我想把超類的「prop」設置爲「true」,但是這段代碼創建並設置了子類「實例」的「prop」爲「true」,留下超類「實例」的prop 「爲假:在JavaScript中,如何訪問超類實例的屬性?

var SuperClass = function() { 
    this.prop = true; 
} 

SuperClass.prototype.doStuff = function() { 
    if (this.prop) { 
     console.log('SuperClass does A.'); 
    } 
    else { 
     console.log('SuperClass does B.'); 
    } 
} 

SuperClass.prototype.load = function() { 
    this.prop = false; 
} 

SuperClass.prototype.setProp = function(val) { 
    this.prop = val; 
} 

function SubClass() { 
    SuperClass.call(this); 
} 

SubClass.prototype = Object.create(SuperClass.prototype); 
SubClass.prototype.constructor = SubClass; 

SubClass.prototype.doStuff = function() { 
    SuperClass.prototype.doStuff(); 

    if (this.prop) { 
     console.log('SubClass does A.'); 
    } 
    else { 
     console.log('SubClass does B.'); 
    } 
} 

SubClass.prototype.load = function() { 
    SuperClass.prototype.load(); 
} 

var anObject = new SubClass(); 
anObject.load(); 
anObject.setProp(true); 
anObject.doStuff(); 

當前,輸出是」SuperClass does B. SubClass does A.「,這不是所需的結果。我如何正確設定「道具」的價值,使他們都做「A」?我沒有試圖在子類的實例中創建一個新的屬性,我想訪問超類的實例中的現有屬性。

謝謝!

另外,你可以從子類的構造函數中訪問超類的實例屬性嗎?或者是否需要首先實例化子類?

回答

5
SubClass.prototype.doStuff = function() { 
    SuperClass.prototype.doStuff(); 

你沒有給超類的任何上下文,因此不作用於當前對象的功能(即this將是錯誤的)。

而是嘗試:

SubClass.prototype.doStuff = function() { 
    SuperClass.prototype.doStuff.call(this); 

這給了我想要的輸出:

SuperClass does A. 
SubClass does A. 
+0

唉唉,我明白了!因此,無論何時,我通過執行.call(this)來調用超類的方法,它將首先使用子類「實例」的屬性,並且即使在超類的實例中還有同名的屬性也無關緊要。非常感謝! – PolkaPunk

+0

對象中只有一個屬性'prop',而不是super和subclass的單​​獨屬性。從任一原型中的函數訪問'this.prop'都會證實這一點。你在做的是調用超類函數_而不是object_的範圍,所以超類方法'this'內部將是全局範圍,而不是你認爲的那個對象。由於在全局範圍內沒有'prop','this.prop'是未定義的,'if(this.prop)'爲false,並且你碰到else分支。 –

相關問題