2013-10-23 66 views
3

嗨,大家好我有一個關於OBJ問題在javascript 我怎麼能訪問父類的屬性訪問從子JavaScript的父類的屬性

function randomObj() // for example button obj 
{ 
    this.text = "this is obj"; 
} 

function parentClass() 
{ 
    this.name = "parent"; 
    this.subObj; 
} 

parentClass.prototype.generate = function() 
{ 
    this.subObj = new randomObj(); 
    this.subObj.changeParentClassName = function() // button obj wants to change name 
    { 
     this.name = "not parent"; 
    } 
} 

var sampleObj = new parentClass(); 
sampleObj.generate(); 
sampleObj.subObj.changeParentClassName(); // does not works 

好像「這」在「changeParentClassName」是subObj,我怎麼能訪問parentclass.name? 任何人都可以幫忙?

+2

在'function(){...}'表達式之前跳過'new'。它使用'function'作爲構造函數立即創建一個實例。 –

+0

@JonathanLonowski sry當我寫這個問題時,錯字.. thx反正^^ –

回答

5

調用該函數時,JavaScript的this將成爲.左側的對象。在這種情況下,它是subObj而不是parentObj,因此您在subObj上設置name。您有2個選項,您可以將this置於generate之內的其他變量中,因此它不會被JavaScript的this邏輯取代。喜歡的東西:

var parentObj = this; 
this.subObj.changeParentClassName = function() // button obj wants to change name 
{ 
    parentObj.name = "not parent"; 
}; 

或者你可以使用bind()創建,將有this綁定到一個已知的對象(在這種情況下,你的父對象)的新功能是這樣的:

this.subObj.changeParentClassName = (function() // button obj wants to change name 
{ 
    this.name = "not parent"; 
}).bind(this); // bind the 'this' inside the changeParentClassName to the 'this' inside generate 

查看Function bind()以獲取有關綁定和交互式示例的更多信息。請注意,如果您要使用最新版本的Javascript(ECMAScript 6或更高版本),則可以使用=>函數,該函數與聲明範圍相比不會更改this的值。所以你可以使用:

this.subObj.changeParentClassName =() => // button obj wants to change name 
{ 
    this.name = "not parent"; 
}; 
+0

哇幫助它^^ –