2011-01-07 54 views
5


我有以下的代碼 -JavaScript的無限循環與defineSetter

var obj = { 
    name : "Yosy" 
}; 

obj.__defineSetter__("name",function(v){ 
    alert(v); 
}); 

的問題是 -
如果我改變obj.name到別的和執行console.log(OBJ)我會得到未定義在名稱屬性上。 所以我試圖修復obj。 defineSetter本 -

var obj = { 
    name : "Yosy" 
}; 

obj.__defineSetter__("name",function(v){ 
    alert(v); 
    this.name = v; 
}); 

如果您更改名稱爲「ABC」或別的東西,你會得到一個無限循環,因爲在defineSetter我設置「名稱」屬性的值。
該怎麼辦?

回答

8

好吧,如果你希望能夠使用name財產正常人一樣,仍然提醒值,以及,你應該以不同命名的對象領域,如:

var obj = { 
    _name : "Yosy" 
}; 

obj.__defineSetter__("name",function(v){ 
    alert(v); 
    this._name = v; 
}); 

obj.__defineGetter__("name",function() { 
    return this._name; 
}); 

或者是這樣的:

var obj = { 
    fields: { 
     name : "Yosy" 
    } 
}; 

obj.__defineSetter__("name",function(v){ 
    alert(v); 
    this.fields.name = v; 
}); 

obj.__defineGetter__("name",function() { 
    return this.fields.name; 
}); 

當你設置屬性時,防止二傳手再次發射。

編輯:

任何有興趣,這裏的一些文檔:https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Working_with_Objects#Defining_Getters_and_Setters

+0

+1,只需再添加一個資源http://ejohn.org/blog/javascript-getters-and-setters/ – Biswanath 2011-01-07 08:57:51