Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带defineSetter的javascript无限循环_Javascript - Fatal编程技术网

带defineSetter的javascript无限循环

带defineSetter的javascript无限循环,javascript,Javascript,我有以下代码- var obj = { name : "Yosy" }; obj.__defineSetter__("name",function(v){ alert(v); }); 问题是- 如果我将obj.name更改为其他内容,并将console.log(obj)更改为name属性的未定义项。 所以我试着修复obj。定义设置 var obj = { name : "Yosy" }; obj.__defineSetter__("name",function(v)


我有以下代码-

var obj = {
    name : "Yosy"
};

obj.__defineSetter__("name",function(v){
    alert(v);
});
问题是-
如果我将obj.name更改为其他内容,并将console.log(obj)更改为name属性的未定义项。 所以我试着修复obj。定义设置

var obj = {
    name : "Yosy"
};

obj.__defineSetter__("name",function(v){
    alert(v);
    this.name = v;
});
如果您将名称更改为“ABC”或其他名称,您将得到一个无限循环,因为在defineSetter中,我正在设置属性“name”的值

怎么办?

好吧,如果您希望能够像正常情况一样使用
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;
});
或者像这样:

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;
});
防止设置程序在设置属性时再次触发

编辑:


对于任何感兴趣的人,这里有一些文档:

+1,只是为了添加另一个资源,在变量名的约定之前我不知道整个下划线…修复了我的无限循环问题,谢谢!