JavaScript:内部对象的Setter

时间:2017-11-22 01:13:55

标签: javascript object setter

我在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;   
    },

2 个答案:

答案 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不喜欢新属性。

这意味着我需要为旧版浏览器提供功能性替代方案,并等待它们消亡......