最近我一直在写一些JavaScript程序,其中涉及getter和setter的使用。我阅读了两种方法的MDN文档,但尝试使用它们时感到困惑。
简而言之,我只想创建一系列相似的属性,这些属性将具有相同的getter和setter,但我不想为每个属性重写每个单独的setter和getter。
如上所述,我尝试执行以下代码:
var defaultProperty = {
set: function(val) {
this.value = val - 1; // Just an example
},
get: function() {
return this.value + 1; // Just an example
}
};
var myObj = {};
Object.defineProperties(myObj, {
foo: defaultProperty,
bar: defaultProperty
});
然后,我为foo
和bar
属性分配了新值,如下所示:
myObj.foo = 3;
myObj.bar = 7;
最后,我期待这样的事情:
console.log(myObj.foo, myObj.bar);
> 3 7
但是我出人意料地得到了这个:
> 7 7
看起来这两个属性要么引用相同的内存地址,要么共享相同的setter / getter。注意到这一点,我试图解决问题,并分别创建每个属性,如下所示:
Object.defineProperties(myObj, {
foo: {
set: function(val) {
this.value = val - 1;
},
get: function() {
return this.value + 1;
}
},
bar: {
set: function(val) {
this.value = val - 1;
},
get: function() {
return this.value + 1;
}
}
});
但是结果是一样的:
myObj.foo = 3;
myObj.bar = 7;
console.log(myObj.foo, myObj.bar);
> 7 7
我也尝试使用__defineSetter__
and__defineGetter__
函数,但是结果没有改变。
现在,在解决我的问题的几次失败尝试之后,我想知道:
是否可以在对象的不同属性上定义相同的setter和getter?
是的,尽管根据您的经验不建议这样做,但不建议这样做。
我在做什么错,为什么我的属性表现得像是同一属性?
因为它们存储/访问值,所以设置/获取的值始终存储在.value
对象的同一属性中:myObj.value == 6
所以myObj.foo
和myObj.bar
yield都一样7
。
有什么更好的方法可以完成我想做的事情?
将值存储在闭包作用域变量中,并使用函数定义属性:
function makeDefaultProperty(obj, name) {
var value;
return Object.defineProperty(obj, name, {
set: function(val) {
value = val - 1; // Just an example
},
get: function() {
return value + 1; // Just an example
}
});
};
var myObj = {};
makeDefaultProperty(myObj, "foo");
makeDefaultProperty(myObj, "bar");
当然,除了使用局部变量之外,您还可以简单地使用不同的“内部”属性,并且还可以使用通过函数创建公共设置器/获取器的其他方法。两者都适用:
function defaultProperty(name) {
return {
set: function(val) {
this[name] = val - 1; // Just an example
},
get: function() {
return this[name] + 1; // Just an example
}
};
}
var myObj = Object.defineProperties({}, {
foo: defaultProperty("_foo"),
bar: defaultProperty("_bar")
});
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句