【发布时间】:2015-04-25 13:32:36
【问题描述】:
问题
最近我一直在编写一些涉及使用getters 和setters 的JavaScript 程序。我阅读了这两种方法的 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__ 和__defineGetter__ 函数,但结果没有改变。
我的问题
现在,在尝试解决我的问题几次失败后,我想知道:
- 是否可以在对象的不同属性上定义相同的 setter 和 getter?
- 如果是这样,我做错了什么,为什么我的属性表现得好像它们是同一个属性?
- 有没有更好的方法来完成我正在尝试做的事情(可能不需要为每个属性编写每个 setter 和 getter)?
【问题讨论】:
标签: javascript setter getter getter-setter