我希望在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”。
答案 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上询问是否有某种方法可以欺骗编译器。