希望我正在尝试做的事情是可能的。我正在尝试为对象内的任何对象创建一个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的对象,它也可用于下一级对象(如上所述)?
答案 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