为什么使用访问器(getters 和 setters)

why to use accessor ( getters and setters)?

本文关键字:getters setters 访问 为什么      更新时间:2023-09-26
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'

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

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

像这样使用:

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

能不能得到我们设定的值吗?我想我不了解访问器的用法,为什么我们专门使用它?

也许

这会向你解释更多

var obj = {
 get foo(){
  console.log('getter'); 
  return this._foo;}, 
 set foo(v){
  console.log('setter'); 
  this._foo = v;
 }
}

虽然从传递参数的对象中获取值没有任何意义。
而设置传递参数的值将意味着并表示需要设置的值。

铬控制台。AFter 初始化对象

obj.foo = "UI"
setter
"UI"
obj.foo
getter
"UI"

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

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

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

var obj = {
  get foo(){
    return this.___foo___
  },
  set foo(value){
    this.___foo___ = value;
  }
}

所以现在getset只是对___foo___财产的受控访问。

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

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

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

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

{a:0} 

而不是

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

其他片段,带有 js "privates":

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!
///...