Javascript 为什么要使用访问器(getter和setter)?
所以,我想在设置foo时得到它的值: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
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!
///...