2016-05-21 37 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上詢問是否有某種方法欺騙編譯器去做這件事。