2
/**
 * @param {Object} object
 * @param {(string|number)} name
 * @param {*} value
 */
var fabric = function(object, name, value) {
    object[name] = value;
};


fabric(Number, 'MAX_INTEGER', 9007199254740991);
// ...

console.log(Number.MAX_INTEGER); // 9007199254740991

警告:JSC_INEXISTENT_PROPERTY:属性 MAX_INTEGER 从未在第 14 行字符 12 的数字上定义

如何在没有预定义的情况下声明动态属性?

升级版:

数字['MAX_INTEGER'];

4

2 回答 2

3

这属于文档的 ADVANCED_OPTIMIZATIONS 限制。您必须始终使用点分表示法或引用语法来引用属性。当您混合访问时,编译器可能会重命名点分访问,但不会触及引用的语法,从而生成不正确的代码。

于 2013-09-03T13:03:07.587 回答
1

如果您确实想以这种方式添加属性,您有两种选择:

在你的外部添加一个存根声明(这将防止重命名):

/** @const {number} */
Number.MAX_INTEGER;

或将 @lends 与对象文字一起使用:

/**
 * @param {Object} object
 * @param {Object} props
 */
var fabric2 = function(object, props) {
  for (var prop in props) {
    object[prop] = props[prop];
  }
};

fabric2(Number, /** @lends {Number} */ { MAX_INTEGER: 9007199254740991 });
于 2013-09-03T23:48:41.997 回答