对象中所有孩子的javascript getter和setter

时间:2015-01-10 11:38:59

标签: javascript object

我的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中的所有对象执行此操作?

1 个答案:

答案 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中无法实现。