2016-03-31 12 views
0

bugün Google Closure Compiler tarafından mülk yeniden adlandırmayla ilgili bir sorun buldum.Google Closure Compiler, bazı özellikler hiçbir zaman yeniden adlandırılmayacak mı?

// ==ClosureCompiler== 
// @compilation_level ADVANCED_OPTIMIZATIONS 
// @output_file_name default.js 
// ==/ClosureCompiler== 

// ADD YOUR CODE HERE 


console.info({ 
    foo: 'bar', 
    index: 10, 
    bla: 'x' 
}); 

hep derler: Bu kod neden biri bana açıklayabilir eğer mutlu olurdu

console.info({b:"bar",index:10,a:"x"}); 

özelliği "index" bazı farklı isme adlandırılacak asla. Soru neden? Ve zorlamak nasıl yeniden adlandırılır?

+0

Bu oldukça zor bir sorundur. Bu sorun, kapama derleyicisi devs bir tarafından bir bakış sağlayabilir bazı yorum: https://github.com/google/closure-compiler/issues/1054#issuecomment-127026064. – ach

+0

Evet, bu harika, ancak Object.prototype öğesinde "index" üyesi yok ... – Ruslan

+0

@Ruslan FYI bu amaçlanan bir davranıştır. Derleyici, bilinen özellik isimlerini kontrol eder ve bunları yeniden adlandırmayı önler – user120242

cevap

1

Genel olarak, Closure Compiler türlerine göre yeniden adlandırabilir. Ancak, gevşek tipler karşısında geri çekiliyor. Doğrudan prototip özelliklerine atanmamış nesne hazırlıkları bu gevşek tiplerden biridir. Burada standart externs içinde bir "index" özelliği bulunduğundan yeniden adlandırılmamıştır. Orada birkaç tanım vardır ama burada biridir:

https://github.com/google/closure-compiler/blob/641cf61b99280b8bb4b62ecce873e51208501fec/externs/es3.js#L718

+0

Yine de neden Object.prototype üzerinde daraltıldığını anlayamıyorum, GCC'nin bu özelliğin Array ile ilgili olmayan örneklerden geldiğini tespit etmesi çok zor ? – Ruslan

+0

Sadece nesne edebi ile çok uğraşmıyor. – John

0

Sadece, sadece diğer tarafından kullanılmayan başka bir şeye bu özelliği yeniden adlandırmak olacak bu "çok akıllı mantığı" anlamak için bir zaman yok nesneler.

İlgili konular