Javascript getter和setter-递归问题

Javascript getter和setter-递归问题,javascript,recursion,getter-setter,Javascript,Recursion,Getter Setter,有人能帮我理解一下javascript的setter和getter中“u”字符的意义吗。例如,我有下面的代码,可以很好地工作 var user = { get name() { return this._name; }, set name(value) { this._name = value; } }; var me = user; me.name = "Rob"; alert(me.name); 但是如果我删除下划

有人能帮我理解一下javascript的setter和getter中“u”字符的意义吗。例如,我有下面的代码,可以很好地工作

var user = {
    get name() {
        return this._name;
    },    
    set name(value) {
        this._name = value;
    }
};

var me = user;
me.name = "Rob";

alert(me.name);
但是如果我删除下划线,使我的代码看起来如下所示,那么我的代码将无法工作,并且我会在浏览器控制台中收到一个错误,声明“RangeError:超出了最大调用堆栈大小”

var用户={
获取名称(){
返回此.name;
},    
集合名称(值){
this.name=值;
}
};
var me=用户;
me.name=“Rob”;
警报(我的名字);

有人能给我解释一下在这种情况下“u”的作用吗?

很简单。在第二个示例中,
get
调用自身

由于您引用了属性
me.name
,JavaScript需要
获取该属性。发生这种情况时,将触发getter。使用第二个示例,JavaScript调用getter,但getter随后被告知执行完全相同的操作:获取它要处理的属性。函数总是调用自身,使其无限递归

但是,在第一个示例中,在getter中检索的属性与最初触发getter的属性不同。getter检索的值在某种程度上是一个存储组件,以避免上述递归问题。这两个属性之间没有实际的连接,即使它们有相似的名称


同样的想法也适用于二传手。

这很简单。在第二个示例中,
get
调用自身

由于您引用了属性
me.name
,JavaScript需要
获取该属性。发生这种情况时,将触发getter。使用第二个示例,JavaScript调用getter,但getter随后被告知执行完全相同的操作:获取它要处理的属性。函数总是调用自身,使其无限递归

但是,在第一个示例中,在getter中检索的属性与最初触发getter的属性不同。getter检索的值在某种程度上是一个存储组件,以避免上述递归问题。这两个属性之间没有实际的连接,即使它们有相似的名称


同样的想法也适用于setter。

它是用于标识私有变量或属性的命名约定。
\uu
对JS没有特殊意义

来自Airbnb JavaScript:

命名私有属性时,请使用前导下划线


它是用于标识私有变量或属性的命名约定。
\uu
对JS没有特殊意义

来自Airbnb JavaScript:

命名私有属性时,请使用前导下划线


名称(带下划线)是您的
用户
对象私有的,但是
名称(不带下划线)是公共的,可以从外部范围进行更改。因此,基本上,您从外部调用
name
,然后它再次调用自身,因此它成为递归的。js中没有私有/公共属性,只是名称冲突。对于getter,您需要一个与access属性分开的状态变量。
\u name
(带下划线)对于
用户
对象是私有的,但是
name
(不带下划线)是公共的,可以从外部范围进行更改。因此,基本上,您从外部调用
name
,然后它再次调用自身,因此它成为递归的。js中没有私有/公共属性,只是名称冲突。您需要一个独立于getter的访问属性的状态变量。问题-在js中,使用getter/setter操作的任何属性都应该添加下划线,这是一个惯例吗?@ankurmawaha它有时用于私有字段,这些字段是。Anibe Agamah的回答更多地谈到了这一点。假设我有一个属性
this.name
,我试图在
get name
中使用
this.name
访问它,然后发生递归,这是可以理解的。但是只要在
get name
中做一个更改,即使用
this.\u name
就可以了。因此,js似乎在内部添加了一些东西,用
\uuu
和普通属性名来标识属性。这是我仍然不确定的。@ankurmawaha使用
\u name
而不是
name
使用的是一个完全不同的变量。您可以使用除
name
之外的任何其他变量名。如果使用
name
,JavaScript需要调用它的getter,这是当前函数,它会导致无限递归。与此相同:
函数getname(){return getname()}
。如果你使用的是没有getter的
\u name
,你就得到了它的值。谢谢你的耐心,伙计,你太棒了。我意识到我犯了一些愚蠢的错误。问题-在js中,使用getter/setter操作的任何属性都应该添加下划线,这是一种惯例吗?@ankurmawaha它有时用于私有字段,这些字段是。Anibe Agamah的回答更多地谈到了这一点。假设我有一个属性
this.name
,我试图在
get name
中使用
this.name
访问它,然后发生递归,这是可以理解的。但是只要在
get name
中做一个更改,即使用
this.\u name
就可以了。因此,js似乎在内部添加了一些东西,用
\uuu
和普通属性名来标识属性。这是我仍然不确定的。@ankurmawaha使用
\u name
而不是
name
使用的是一个完全不同的变量。您可以使用除
var user = {
    get name() {
        return this.name;
    },    
    set name(value) {
        this.name = value;
    }
};

var me = user;
me.name = "Rob";

alert(me.name);

</script>