2011-01-07 64 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