2016-03-31 2 views
0

сегодня я нашел проблему, связанную с переименованием свойств компилятором Google Closure. Был бы рад, если кто-то может объяснить мне, почему этот код:Google Closure Compiler, некоторые свойства никогда не будут переименованы?

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

// ADD YOUR CODE HERE 


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

всегда компилируется:

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

«индекс» собственности никогда не будет переименована в какое-то другое имя. Вопрос в том, почему? И как заставить его переименовать?

+0

Это довольно сложный вопрос. Комментарий этой проблемы одним из разработчиков компилятора замыкания может дать некоторую информацию: https://github.com/google/closure-compiler/issues/1054#issuecomment-127026064. – ach

+0

Да, это круто, но на объекте Object.prototype нет элемента «index» ... – Ruslan

+0

@Ruslan FYI это предназначенное поведение. Компилятор проверяет имена известных свойств и избегает их переименования. – user120242

ответ

1

Как правило, компилятор Closure может переименовываться на основе типов. Тем не менее, он отступает перед лицом свободных типов. Объектные литералы, которые напрямую не привязаны к свойствам прототипа, являются одним из этих свободных типов. Здесь он не переименовывается, потому что свойство «index» существует в стандартном externs. Есть несколько определения, но здесь один:

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

+0

По-прежнему я не могу понять, почему он не свалился в Object.prototype. Насколько сложно GCC определить, что это свойство исходит из экземпляра, который не связан с массивом ? – Ruslan

+0

Это просто не очень-то сложно с объектными литералами. – John

0

Просто нет времени для понимания этого «очень умной логики», я просто переименовать это свойство на что-то другое, которое не используются другими объекты.

Смежные вопросы