2016-05-21 33 views
0

我希望在ADVANCED_OPTIMIZATIONS模式下重命名对象属性。优化前如何使用GCC重命名由Object.defineProperty创建的属性

代码:

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

关闭编译器不改名属性名称 - “项目”。

+0

为什么要重命名它? – Oriol

+0

我不认为任何编译器会自行重命名任何对象属性。自动执行是危险的。 – Thomas

+0

我很震惊:https://developers.google.com/closure/compiler/docs/api-tutorial3#propnames我的结论:千万不要使用gcc的ADVANCED_OPTIMIZATIONS。我会使用一些外国minifyer像uglifyjs – Thomas

回答

3

正如@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定义的属性不符合型为主的重命名和仿佛属性未在任何类型中设置的实习医生定义这样才会更名。因此,我的示例用items$取代items属性。

2

关闭编译器不会重命名是不断用带引号的字符串中引用属性:

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

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

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