javascript - 递归 Object.defineProperty() setter/getter

标签 javascript recursion prototype

我正在尝试递归地将类构造函数参数中的对象值分配为类的属性。无法弄清楚如何进行递归 - 大多数时候出现“超出最大调用堆栈大小”和无限循环。 这是演示:

const Locale = function(rules) {    
    for (let prop in rules) {
        Object.defineProperty(this, prop, {
            get: function () {
                console.log('getter for "%s" called', prop)
                return rules[prop];
            }
        });
    }
}

const rules = {
    a: {
        b: {
            c: 'value'
        }
    }
}

const locale = new Locale(rules);

console.log(locale.a.b.c);

现在我得到以下控制台输出:

getter for "a" called
value

如何为rules对象的每一层分配一个getter?预期的控制台输出:

getter for "a" called
getter for "b" called
getter for "c" called
value

最佳答案

您需要为 rules 对象的每个嵌套级别创建一个 Locale 对象:

const Locale = function(rules) {    
    for (let prop in rules) {
        Object.defineProperty(this, prop, {
            get: function () {
                console.log('getter for "%s" called', prop);

                // create new Locale if object, return value if not an object
                if( rules[prop] !== null && typeof rules[prop] === 'object' )
                    return new Locale( rules[prop] );
                else
                    return rules[prop];
            }
        });
    }
}

const rules = {
    a: {
        b: {
            c: 'value'
        }
    }
}

const locale = new Locale(rules);
console.log(locale.a.b.c);

关于javascript - 递归 Object.defineProperty() setter/getter ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37568202/

相关文章:

javascript - Polymer-redux 对象观察

list - Erlang:递归与列表

jquery - Rails Ajax 使用 RJS 隐藏/显示切换链接

c++ - C/C++ 函数 - 如何允许原型(prototype)?

javascript - 如何通过css、js、UAS ..识别MS Edge浏览器?

javascript - 垂直滚动时不允许水平滚动(反之亦然)

javascript - 类名 javascript 与 addClass jQuery 相同吗?

java - 遍历树找到节点

Javascript 递归检查

types - 在 Swift 中实现闭包协议(protocol)