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

时间:2016-05-21 17:28:51

标签: 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”。

2 个答案:

答案 0 :(得分:4)

正如@owler正确回答的那样,Closure-compiler不能重命名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定义的属性不适用于基于类型的重命名,因此只有在外部集中的任何类型上未定义属性时才会重命名。因此,我的示例将items属性替换为items$

答案 1 :(得分:2)

Closure Compiler不会重命名以引用字符串引用的属性:

  

尽可能使用点语法属性名称而不是带引号的字符串。仅当您不希望Closure Compiler重命名属性时才使用带引号的字符串属性名称。

请参阅https://developers.google.com/closure/compiler/docs/api-tutorial3#enable-ui

由于Object.defineProperty需要一个字符串作为属性名称,我猜测没有办法让Closure Compiler重命名它。如果你真的需要这个,你可以在Closure Compiler Forum上询问是否有某种方法可以欺骗编译器。