首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >递归Object.defineProperty() getter

递归Object.defineProperty() getter
EN

Stack Overflow用户
提问于 2016-06-01 12:07:30
回答 2查看 589关注 0票数 1

我试图递归地将类构造函数参数中的对象值赋值为类的属性。无法理解如何进行递归--大多数情况下获得“最大调用堆栈大小超过”和无穷大循环。下面是演示:

代码语言:javascript
复制
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);

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

代码语言:javascript
复制
getter for "a" called
value

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

代码语言:javascript
复制
getter for "a" called
getter for "b" called
getter for "c" called
value
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-06-01 12:41:29

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

代码语言:javascript
复制
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);
票数 2
EN

Stack Overflow用户

发布于 2020-05-26 23:15:31

如果您只想使用一个函数而不是一个类,您可以:

代码语言:javascript
复制
var locale = (rules) => {
  if (rules !== null && typeof rules !== 'object') return rules
  return Object.defineProperties({}, Object.keys(rules).reduce((acc, key) => ({
    ...acc,
    [key]: {
      get: () => {
        console.log('getter for "%s" called', key)
        return locale(rules[key])
      }
    }
  }), {}))
}

var l = locale(rules)
console.log('locale', l)
console.log(l.a.b.c)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37568202

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档