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

时间:2014-12-13 22:08:46

标签: javascript

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;
  }

我们能否获得我们设定的价值?我想我不理解访问者的用法,为什么我们专门用它?

3 个答案:

答案 0 :(得分:2)

可能会更多地向你解释

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

从传递参数的对象获取值不会意味着什么 设置传递参数的值意味着代表需要设置的值。

Chrome控制台。初始化对象

obj.foo = "UI"
setter
"UI"

obj.foo
getter
"UI"

答案 1 :(得分:0)

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

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

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

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

现在,getset只是对___foo___属性的受控访问。

答案 2 :(得分:0)

当你需要为属性实现一些非标准逻辑时,你需要setter / getters 例如,下一个对象会累积所有分配:

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