为JavaScript Object创建getter

时间:2017-04-29 16:12:04

标签: javascript

希望我正在尝试做的事情是可能的。我正在尝试为对象内的任何对象创建一个getter。

这是我到目前为止所拥有的:

Object.defineProperty(Settings.Data['_' + type], name, {
    get: function(){
        return Settings.__Data['_' + type][name];
    },
    set: function(value){
        Settings.__Data['_' + type][name] = value;
        console.log('__Data._' + type + '.' + name + ': Updated!');
        console.log(Settings.__Data['_' + type][name]);
    }
});

当我像这样设置对象时,这可以正常工作:

Settings.Data['_' + type][name] = "test";

但不是在我这样做的时候:

Settings.Data['_' + type][name].test = "test";

我认为它会在技术上改变Settings.Data['_' + type][name]属性,但显然不会。

是否可以创建一个带有getter和setter的对象,它也可用于下一级对象(如上所述)?

1 个答案:

答案 0 :(得分:0)

您可以定义一种灵活的对象,当访问不存在的属性时,它不会返回undefined,但是它会动态创建该属性并使其值也是如此灵活的对象

您可以使用ES6代理执行此操作:



function FlexObject() {
    return new Proxy({}, {
        get: function (target, key) {
            // If this key does not exist, create it on the fly
            if (!(key in target)) target[key] = FlexObject()
            // ... and now return its value as if it had already been there
            return target[key];
        }
    });
}

// Demo
var Settings = FlexObject();

var type = "mytype",
    name = "myname";
Settings.Data['_' + type][name].test = "ok";

console.log(Settings.Data['_' + type][name].test); // ok




请注意,一旦为属性赋值,该属性将不再具有先前的灵活性。因此,在执行上述代码后,执行此操作时将出现错误:

Settings.Data['_' + type][name].test.deeper.andDeeper = "too deep";

如果要在为test属性赋值后恢复FlexObject()属性的灵活性,则必须将其删除,或明确指定delete Settings.Data['_' + type][name].test; Settings.Data['_' + type][name].test.deeper.andDeeper = "works!";

compile