【问题标题】:How to declare dynamic properties with Google Closure Compiler?如何使用 Google Closure Compiler 声明动态属性?
【发布时间】:2013-09-05 23:49:13
【问题描述】:
/**
 * @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 从未在 Number 上定义 在第 14 行第 12 个字符

如何声明没有预定义的动态属性?

UPD:

数字['MAX_INTEGER'];

【问题讨论】:

    标签: javascript google-closure-compiler jsdoc


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      /** @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 });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-27
        • 2010-12-14
        • 2014-10-15
        • 2011-05-12
        相关资源
        最近更新 更多