javascript - 如何使用 GCC 重命名由 Object.defineProperty 创建的属性

标签 javascript google-closure-compiler

我希望在 ADVANCED_OPTIMIZATIONS 模式下重命名对象属性。

优化前的代码:

/**
 * @constructor
 */
function Container() {
  var items = [];
  Object.defineProperty(this, 'items', {
    set: function(value) {
      items = value;
    },
    get: function() {
      return items;
    }
  });
}

var container = new Container();
container.items = [1,2,3];
console.log(container.items);

优化后:

var b = new function() {
  var a = [];
  Object.defineProperty(this, "items", {set:function(c) {
    a = c
  }, get:function() {
    return a
  }})
};
b.e = [1, 2, 3];
console.log(b.e);

Closure Compiler 未重命名属性名称 - “items”。

最佳答案

正如@owler 正确回答的那样,Closure 编译器无法重命名 Object.defineProperty 创建的属性,因为它们总是被引用。相反,请使用 Object.defineProperties,因为它们可能被引用或未被引用。

/**
 * @constructor
 */
function Container() {
  var items = [];

  Object.defineProperties(this, {
    items$: {
      set: function(value) {
        items = value;
      },
      get: function() {
        return items;
      }
    }
  });
}

var container = new Container();
container.items$ = [1,2,3];
console.log(container.items$);

注意:通过 Object.defineProperties 定义的属性不符合基于类型的重命名条件,因此只有当属性未在 externs 集中的任何类型上定义时才会被重命名。因此,我的示例将 items 属性替换为 items$

关于javascript - 如何使用 GCC 重命名由 Object.defineProperty 创建的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37366072/

相关文章:

html - 如何在完全离线的工作空间中设置 LimeJS

javascript - JQuery - 未捕获的语法错误 : Unexpected identifier

javascript - JavaScript可以明确用于开发Unity游戏吗?

javascript - 如何使用 Google Closure 编译器

javascript - 在谷歌闭包编译器中使用模块

javascript - "WARNING - Suspicious code. The result of the ' getprop' operator is not being used."是什么意思?

javascript - 对 js 文件进行分组返回奇怪的 js 错误

javascript - Jquery从php/json文件加载数据并将新内容附加到div以进行聊天

javascript - 在生产中使用 babel-node 可以吗

javascript - jQuery UI ReplaceWith() 动画?