我的getter/setter
功能
var o={}
var bValue = {};
Object.defineProperty(o, 'b', {
get: function() { return bValue; },
set: function(newValue) {func(); bValue = newValue; },
});
function func()
{
console.log(o)
}
因此,如果我定义o.b={msg:"hello"}
,它将调用函数func()
。
但是如果我定义o.b.msg="new"
我想要触发func()
,那么我想要的是在此之后。
我尝试了一个for循环,但它不起作用,它显示“max stack exeeded”错误。
如何使用纯JavaScript对o
中的所有对象执行此操作?
答案 0 :(得分:4)
要为func()
的孩子设置新值,请致电o.b
:
var o={};
var children = ['b' /* some known o properties */]
children.forEach(function(child) {
var childValue = {};
Object.defineProperty(o, child, {
get: function() { return childValue; },
set: function(newValue) {
func();
Object.keys(newValue).forEach(function(key) {
var value = newValue[key];
Object.defineProperty(childValue, key, {
get: function() { return value },
set: function(newValue) {
func();
value = newValue;
}
})
});
}
});
});
function func()
{
console.log(o)
}
正如您所看到的,只有事先知道o
对象的属性名称才能执行此操作(请参阅children
变量)。如果要为o
对象的未定义属性创建一个getter,那么目前这是不可能的。如果您可以使用ECMAScript6
,那么您可以通过Proxy
对象实现它(请参阅here)。但是否则此时在javascript中无法实现。