Компилятор закрытия Google не переименовывает свойства

У меня есть массив объектов, которые я генерирую из JSON.parse. Я получаю доступ к его свойствам следующим образом:

AnObject['PhoneList'][i]['PhoneLabel']

Когда я запускаю код через компилятор закрытия google, имя свойств не запутывается и хорошо видно. Почему имена свойств объекта не запутаны?


person frenchie    schedule 07.03.2012    source источник
comment
MyArray[i]MyObject['Prop1'] недопустимый javascript. Пожалуйста исправьте. Возможно, вы имеете в виду MyArray[i].MyObject['Prop1']?   -  person jfriend00    schedule 08.03.2012
comment
@jfriend00: хорошо, поправил. На самом деле это объект, который содержит массив других объектов.   -  person frenchie    schedule 08.03.2012
comment
Вы используете строки: ['PhoneList'] и ['PhoneLabel']. Компилятор Closure никогда не переименовывает строки.   -  person AndroidDev    schedule 18.07.2017


Ответы (3)


Закрытие Google с трудом выясняет, что он может и не может переименовывать. Например, любая структура данных, которая создается или на которую ссылается код вне скомпилированного кода закрытия Google, не может быть переименована, или две стороны не будут ожидать один и тот же код. Кроме того, обращение к свойствам через сконструированные строки делает практически невозможным правильное выполнение замыканием своей работы. Таким образом, Closure имеет целую кучу правил и настроек, которые помогут вам контролировать это и указывать, что делать. Я бы посоветовал вам прочитать об этих правилах/настройках по этим ссылкам:

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

https://developers.google.com/closure/compiler/docs/compilation_levels

https://groups.google.com/group/closure-stylesheets-discuss/browse_thread/thread/386ba6db27a43887?pli=1

https://developers.google.com/closure/compiler/docs/limitations

И, цитата из этой последней ссылки:

Строковые представления имен функций или параметров:

Компилятор переименовывает функции и параметры функций, но не изменяет никаких строк в вашем коде, которые ссылаются на функции или параметры по имени. Таким образом, вам следует избегать представления имен функций или параметров в виде строк в вашем коде. Например, функция argumentsNames() библиотеки Prototype использует Function.toString() для получения имен параметров функции. Но в то время как argumentsNames() может соблазнить вас использовать имена аргументов в вашем коде, компиляция в простом режиме нарушает этот вид ссылки.

person jfriend00    schedule 07.03.2012
comment
Я изменил запись с точки на запись в скобках, потому что получал предупреждение о том, что свойства не определены. stackoverflow.com/questions/9561138/ - person frenchie; 08.03.2012
comment
@frenchie - Ну, это не позволяет закрытию делать то, что нужно для этих свойств. Я уже несколько раз говорил вам свою часть о том, что вы делаете в этом другом вопросе. Ни один инструмент компиляции/скрытия/сжатия не может успешно переименовывать свойства, созданные внешним агентством (вне области компиляции). Похоже, это то, что вы делаете или хотите сделать. Вы загружаете JSON из некоторого HTML (который выходит за рамки Closure), поэтому эти свойства нельзя переименовать с помощью замыкания, иначе ваш код не будет соответствовать JSON. - person jfriend00; 08.03.2012
comment
Я все еще очень запутался в этом вопросе. Строка json содержит данные о встрече на определенный день. Когда страница загружается, HTML содержит данные за текущий день. Затем пользователь также может загрузить данные для другого через ajax. В любом случае это один и тот же объект, и функция начинается с разбора строки json; независимо от того, откуда он исходит из HTML или ajax. Как мне написать функцию, которая берет строку json и анализирует ее, чтобы работал компилятор замыкания? - person frenchie; 08.03.2012
comment
@frenchie - если строка JSON создается на вашем сервере (либо через ajax, либо через начальную страницу), вы не можете разрешить переименование свойств в этой строке JSON, потому что даже если ваш клиентский код переименует все ссылки на них, код сервера будет по-прежнему генерировать исходные/более длинные имена свойств. Таким образом, рекомендуется ссылаться на эти имена свойств через ссылки на строки ['propName'], чтобы компилятор закрытия не связывался с ними. Есть и другие варианты, приведенные в некоторых ссылках, которые я цитировал в своем ответе, но все ответы должны предотвращать переименование на стороне клиента для них. - person jfriend00; 08.03.2012
comment
хорошо спасибо; вы правы в том, что, поскольку я использую одно и то же имя свойства объекта для десериализации сервера json, на самом деле лучше не переименовывать их. Я оставлю свои объекты в квадратных скобках. - person frenchie; 08.03.2012

Строки в кавычках — это синтаксис, используемый для свойств, которые не следует переименовывать («экспортировать»). вы, вероятно, хотите использовать

AnObject.PhoneList[i].PhoneLabel

вместо.

person Has QUIT--Anony-Mousse    schedule 07.03.2012

Google Closure Compiler не затрагивает строки в кавычках.

myObj.prop = 3;

приведет к переименованию prop (и, возможно, myObj тоже)

myObj['prop'] = 3;

приведет к тому, что 'prop' останется нетронутым.

person Paolo    schedule 10.01.2013