我在Traditional JavaScript中有一个简单的对象和构造函数,如下所示:
function Test() {
this.data={};
}
Test.prototype={
set value(something) {
},
get value() {
return data[property];
}
};
var test=new Test();
对象内部是另一个对象,最初没有自己的属性。
我想为value
编写一个Setter,它在内部对象(data
)上设置一个属性。
test.value.whatever=23;
我有什么方法可以做到这一点吗?
我希望Setter函数可以用这样的方式完成工作:
set value() {
// how do I get property & value?
data[property]=value;
},
答案 0 :(得分:0)
你去吧
function Test() {
this.data = {};
}
Test.prototype={
set value(v) {
this.data.whatever = v;
},
get value() {
return this.data.whatever;
}
};
var test = new Test();
test.value = 'hi';
console.log(test.value) // 'hi'
console.log(test.data) // {whatever: 'hi'}
请记住将data
属性放在构造函数中。否则,如果将它放入原型中,它将是每个实例之间的共享属性。
答案 1 :(得分:0)
好的,我有一个答案:正如@Bergi& amp; @damianmr,我使用(并且必须了解)一个Proxy
对象。
这是一个工作版本:
function Test() {
this.dataStore={};
this.data=new Proxy(this,{
set(target,property,value) {
target.dataStore[property]=value;
},
get(target,property) {
return target.dataStore[property];
}
});
}
Test.prototype={
};
var test=new Test();
test.data.whatever=23;
test.data.etc=46;
alert(`${test.data.whatever} ${test.data.etc}`);
如你所见:
dataStore
的对象,以及一个名为data
这是一个简单的抽象案例,但它也适用于我正在处理的更复杂的项目。
唯一的缺点是IE不支持Proxy,我看到的polyfill不喜欢新属性。
这意味着我需要为旧版浏览器提供功能性替代方案,并等待它们消亡......