创建对象时,如果该对象是该父对象的属性中的父对象的属性,是否可以计算该对象的属性数

时间:2019-06-27 12:59:33

标签: javascript

在创建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
}

但会导致错误“未捕获的TypeError:无法将未定义或null转换为对象”

5 个答案:

答案 0 :(得分:1)

如果可以是一个函数

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);

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

完全复杂,可以通过使用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);

答案 3 :(得分:0)

尝试类似的事情:

open62541_server

答案 4 :(得分:0)

在下一行中使用Object.assign()

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