开发者问题收集

如果创建对象时该对象是父对象的属性,我可以计算该对象的属性数量吗?

2019-06-27
53

我尝试在创建 UTILS 对象时计算 FORMAT_LST_COUNT 属性中 FORMAT_LST 对象的属性数量

var UTILS = {
    FORMAT_LST: {
        'FORMAT1': 'format1',
        'FORMAT2': 'format2',
        'FORMAT3': 'format3'
    },
    FORMAT_LST_COUNT: Object.keys(this.FORMAT_LST).length
}

但它导致错误“Uncaught TypeError:无法将未定义或 null 转换为对象”

3个回答

如果它可以是一个函数

var UTILS = {
  FORMAT_LST: {
    'FORMAT1': 'format1',
    'FORMAT2': 'format2',
    'FORMAT3': 'format3'
  },
  FORMAT_LST_COUNT: function() {
    return Object.keys(this.FORMAT_LST).length
  }
}
console.log(UTILS);
console.log(UTILS.FORMAT_LST_COUNT());

如果它需要是一个属性:

var UTILS = new function() {
  this.FORMAT_LST = {
    'FORMAT1': 'format1',
    'FORMAT2': 'format2',
    'FORMAT3': 'format3'
  };
  this.FORMAT_LST_COUNT = Object.keys(this.FORMAT_LST).length
}
console.log(UTILS);
shrys
2019-06-27

只需将代码包装在函数块中并返回即可。因为否则,对象不知道该语句并将其解释为另一个通常的值。

var UTILS = {
  FORMAT_LST: {
    'FORMAT1': 'format1',
    'FORMAT2': 'format2',
    'FORMAT3': 'format3'
  },
  FORMAT_LST_COUNT: function() { // function block
    return Object.keys(this.FORMAT_LST).length // return it
  }
}

console.log(UTILS.FORMAT_LST_COUNT()) // execute it
weegee
2019-06-27

完全超出复杂性,可以通过使用 defineProperties 方法并将 get FORMAT_LST_COUNT 定义为键的长度来实现。

var UTILS = Object.defineProperties({}, {
  FORMAT_LST: {
    value: {
      'FORMAT1': 'format1',
      'FORMAT2': 'format2',
      'FORMAT3': 'format3'
    },
    enumerable: true
  },
  FORMAT_LST_COUNT: {
    get: function() {
      return Object.keys(this.FORMAT_LST).length;
    },
    enumerable: true
  }
});

console.log(UTILS);
Emil S. Jørgensen
2019-06-27