Javascript 为什么要使用访问器(getter和setter)?

Javascript 为什么要使用访问器(getter和setter)?,javascript,Javascript,所以,我想在设置foo时得到它的值: var obj = { get foo(){//Why can't I use argument ^!^ return 'getter'; }, set foo(value){ console.log('setter: '+value); } } > obj.foo = 'bla' setter: bla >obj.foo 'getter' 这样使用: >obj.foo = 'bla' setter: b

所以,我想在设置foo时得到它的值:

var obj = {
  get foo(){//Why can't I use argument ^!^
    return 'getter';
  },
  set foo(value){
    console.log('setter: '+value);
  }
}

> obj.foo = 'bla'
setter: bla
>obj.foo
'getter'
这样使用:

>obj.foo = 'bla'
setter: bla
>obj.foo
getter: bla

我们不能得到我们设定的值吗?我想我不理解accessor的用法,为什么我们要专门使用它呢?

getter只是为了在对该属性的所有赋值过程中应用额外的逻辑。作为一个
getter
,它接收一个参数是没有意义的,因为在get操作期间没有机会传递一个参数

如果希望
getter
setter
使用属性的当前值,则需要将其存储在getter和setter都可以访问的位置

这可以在同一个对象上,也可以在不同的对象上,或者通过闭包引用的变量

get foo(value){//but alas, I can't use any argument in getter
    return 'getter: '+value;
  }

因此,现在
get
set
只是对
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
属性的受控访问。

这可能会向您解释得更多

var obj = {
  get foo(){
    return this.___foo___
  },
  set foo(value){
    this.___foo___ = value;
  }
}
从对象获取值时,传递参数没有任何意义。
而设置一个传递参数的值意味着并表示需要设置的值

镀铬控制台。初始化对象之后


当您需要为属性实现一些非标准逻辑时,您需要setter/getter。
例如,下一个对象累积所有指定:

obj.foo = "UI"
setter
"UI"

obj.foo
getter
"UI"
当您想编写一些代理对象时,这也很有用,
例如,getter解析来自远程服务器的数据,setter将数据发布到远程服务器

如果您需要简单属性,只需使用

var obj = {
  _a:0,
  get a(){ return this._a;},
  set a(value){this._a+=value;}
}

obj.a = 5;
obj.a = 7;
obj.a
12
而不是

{a:0} 

其他代码片段,带有js“privates”:

{_a:0,get a(){return this._a;},set a(v){this._a=v;}}

你为什么要把一个论点传给一个能手?我的意思是我看到了你想要的结果;我是说结果毫无意义。getter用于访问特定属性。在getter中增加该属性没有意义。这就是问题的根源吗?@vol7ron:那会导致无限递归。@sixfingeredman你说得对。基本上我要说的是,在setter中,您需要将值设置为某个属性
this.value=value
然后在getter中可以检索该属性
return'getter:'+this.value
以及更多,如果您只是设置并检索它,而没有任何副作用-您根本不需要setter/getter..我在您只有一块代码时添加了它。更新后收回。@Bhojendra-C-LinkNepal:下划线没有任何意义。我只是用它作为一种通用的方式来证明它是一些任意的属性,希望不会与其他属性发生冲突。如果你愿意,可以是100个下划线。哦!我不知道这些。@vp_arth:我不知道你在说什么
var obj={}
完全不同。除非你没抓住重点。是的,我没有做任何额外的事情,但是OP显然想做,因此问题来了。OP想知道正确的用例:
为什么我们要专门使用它?
几乎正确。您可以使用getter和setter实现对象访问,以防您希望将其他逻辑与属性的设置/检索相关联。这可能包括抽象(参见decorator模式)访问控制和副作用。
{_a:0,get a(){return this._a;},set a(v){this._a=v;}}
function Obj(key) {
  var private = 0;
  var authorized = false;
  return {
    set token(v) {authorized = (v===key);},
    set data(v) {if(authorized) private = v;}
    get data() {return authorized?private:undefined;}
  }
}
obj = new Obj('pass');
obj.data = 5; // no effect
obj.token = 'pass';
obj.data = 'Data'; //Now works!
///...