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」?我沒有試圖在子類的實例中創建一個新的屬性,我想訪問超類的實例中的現有屬性。
謝謝!
另外,你可以從子類的構造函數中訪問超類的實例屬性嗎?或者是否需要首先實例化子類?
唉唉,我明白了!因此,無論何時,我通過執行.call(this)來調用超類的方法,它將首先使用子類「實例」的屬性,並且即使在超類的實例中還有同名的屬性也無關緊要。非常感謝! – PolkaPunk
對象中只有一個屬性'prop',而不是super和subclass的單獨屬性。從任一原型中的函數訪問'this.prop'都會證實這一點。你在做的是調用超類函數_而不是object_的範圍,所以超類方法'this'內部將是全局範圍,而不是你認爲的那個對象。由於在全局範圍內沒有'prop','this.prop'是未定義的,'if(this.prop)'爲false,並且你碰到else分支。 –