2016-05-21 3 views
0

Ich möchte die Objekteigenschaft im ADVANCED_OPTIMIZATIONS-Modus umbenennen.So benennen Sie die von Object.defineProperty erstellte Eigenschaft mit GCC um

-Code vor der Optimierung:

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

Nach der Optimierung:

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 nicht die Eigenschaftsnamen umbenannt - "Elemente".

+0

Warum möchten Sie es umbenennen? – Oriol

+0

Ich glaube nicht, dass irgendein Compiler jemals irgendeine Objekteigenschaft umbenennen würde. Es ist zu gefährlich, es automatisch zu machen. – Thomas

+0

Ich bin schockiert: https://developers.google.com/closure/compiler/docs/api-tutorial3#propnames Meine Schlussfolgerungen: Verwenden Sie niemals ADVANCED_OPTIMIZATIONS mit gcc. Ich würde einen fremden Minifyzer wie uglifyjs verwenden – Thomas

Antwort

3

Da @owler korrekt beantwortet hat, kann der Closure-Compiler die erstellten Eigenschaften Object.defineProperty nicht umbenennen, da sie immer in Anführungszeichen stehen. Verwenden Sie stattdessen Object.defineProperties, da sie entweder zitiert oder nicht aufgelistet sein können.

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

Hinweis: Eigenschaften über Object.defineProperties definiert sind nicht teilnahmeberechtigt für typbasierte Umbenennung und als solche wird nur umbenannt werden, wenn die Eigenschaft nicht auf jede Art in den Set Externen definiert ist. Als solches ersetzt mein Beispiel die items Eigenschaft durch items$.

2

Closure Compiler nicht Eigenschaften umbenennen, die mit einer Zeichenfolge in Anführungszeichen immer referenziert werden:

Wann immer möglich, verwenden Punktsyntax Eigenschaftsnamen anstatt Strings in Anführungszeichen. Verwenden Sie nur String-Eigenschaftsnamen in Anführungszeichen, wenn Closure Compiler überhaupt keine Eigenschaft umbenennen soll.

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

Da Object.defineProperty eine Zeichenfolge für den Eigenschaftsnamen erfordert Ich vermute, es gibt keine Möglichkeit Closure Compiler, um es umzubenennen. Wenn Sie das wirklich brauchen, können Sie auf der Closure Compiler Forum fragen, ob es eine Möglichkeit gibt, den Compiler dazu zu bringen, das zu tun.

Verwandte Themen