对象中所有 child 的javascript getters和setters

标签 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 循环,但它不起作用,它显示“已执行最大堆栈”错误。

如何使用纯 JavaScript 对 o 中的所有对象执行此操作?

最佳答案

要调用 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 中是不可能的。

关于对象中所有 child 的javascript getters和setters,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27875808/

相关文章:

javascript - 将鼠标悬停在链接上,图像灰度滤镜

javascript - 处理相互依赖和/或分层的异步调用

Java - 没有新实例的对象

javascript - 插入行时nodejs mysql模块出错

javascript - 从 "outside"以编程方式设置knockout.js值

javascript - 导出默认类Page 或导出默认App

javascript - 将对象重组为二维数组对象

PHP:重用对象或复制到数组中更快吗

c++公共(public)对象更改应该调用函数

javascript - 这是什么样的空 Javascript 对象?