Переписывание свойства с именем default с помощью Google Closure Templates

В данных, которые я отправляю в шаблон Google Closure, у меня есть свойство с именем default. Я планирую скомпилировать как код JavaScript, так и код, сгенерированный SoyToJsSrcCompiler, с помощью Google Closure Compiler. Но проблема в том, что сгенерированный код из шаблона не позволяет компилятору переименовать свойство default.

Это код шаблона:

/**
 * @param test
 */
{template .template}
    <div>{$test.a.b.default.c.d}</div>
{/template}

А это сгенерированный код:

/**
 * @param {Object.<string, *>=} opt_data
 * @param {(null|undefined)=} opt_ignored
 * @return {string}
 * @notypecheck
 */
test.template = function(opt_data, opt_ignored) {
  return '<div>' + soy.$$escapeHtml(opt_data.test.a.b['default'].c.d) + '</div>';
};

Есть ли способ получить:

opt_data.test.a.b.default.c.d

вместо:

opt_data.test.a.b['default'].c.d

или любым другим способом, которым я могу сохранить свою собственность с именем default?

Прямо сейчас компилятор переименовывает свойство default в моем коде JavaScript, но не переименовывает его в коде, сгенерированном SoyToJsSrcCompiler, потому что этот код использует цитируемую версию.




Ответы (2)


default — полузарезервированное слово в JavaScript. Он используется в операторах switch case:

switch ( variable ) {
    case a:
        break;
    case b:
        break;
    default:
        break;
}

Это совершенно безопасно при перемещении объекта, но не как переменная уровня области:

object.some.thing.else.default;

Рассмотрим это дерево объектов:

var a = {
    b: {
        c: {
            "1": {
                "default": 2
            } 
        }
    }
};

Вы можете получить значение (2), сказав:

a.b.c[1].default // 2

Но также:

a["b"]["c"]["1"]["default"] // 2

JSHint выдает предупреждение о перемещении объекта в кавычки в ситуациях, не требующих qoute. В данном случае ["b"], ["c"], ["default"].

person andlrc    schedule 17.04.2013
comment
Это правда, но синтаксис вполне допустим, если он используется в качестве ключа. a.default действителен, как и {default: 1}. Если SoyToJsSrcCompiler напишет его с точечным синтаксисом, или если Closure Compiler не переименует его из default во что-то другое, то скомпилированный код должен работать корректно... - person rid; 17.04.2013
comment
@rid только что обновился. Я пытаюсь сказать, что ключ не переименовывается, а просто цитируется. В JavaScript ничего не произойдет - person andlrc; 17.04.2013
comment
Я имею в виду компилятор Closure. Инструмент переименовывает почти все клавиши, не заключенные в кавычки. Мой код содержит ключ без кавычек. Сгенерированный код содержит ключ с кавычками. Поэтому в скомпилированном коде будет переименованное свойство (мое, то, что без кавычек) и непереименованное свойство (сгенерированное, с кавычками), которое в итоге не сработает, т.к. одна часть кода ссылается на переименованное свойство, а другая часть относится к непереименованному свойству. Поэтому я ищу для этого решение, которое не требует использования имени, отличного от default. - person rid; 17.04.2013
comment
Вероятно, это связано с тем, что в ecmascript 3 это НЕ совсем правильно, хотя браузеры это разрешают. В ecmascript 5 это разрешено. Я рекомендую зарегистрировать проблему в проекте closure-templates, так как кажется, что ее следует решить. code.google.com/p/closure-templates/issues/list - person Chad Killingsworth; 17.04.2013
comment
@ChadKillingsworth, я также использовал --language_in=ECMASCRIPT5_STRICT, чтобы сообщить компилятору, что он должен обрабатывать исходный код как строгий ECMAScript 5. default по-прежнему не разрешен в строгом ECMAScript 5? - person rid; 17.04.2013
comment
@ChadKillingsworth, ... но, конечно, это не имеет значения, потому что сгенерированный код шаблона не имеет ничего общего с компилятором, когда он генерируется ... Это имело бы значение только в том случае, если бы у генератора была возможность узнать, какая версия ECMAScript для цели. Что заставляет меня задаться вопросом, что произойдет, если я скомпилирую код JavaScript в режиме ECMAScript 3. Проверка. - person rid; 17.04.2013
comment
Я предполагаю, что Closure-templates необходимо обновить для поддержки имен свойств ecmascript 5. - person Chad Killingsworth; 17.04.2013
comment
@ChadKillingsworth, проверено. Компилятор в режиме ECMAScript 3 выдает ошибку. В 5, если не использовать расширенную оптимизацию, он заключает в кавычки default. В 5 с расширенными оптимизациями переименовывает default. Я вижу, что он не переименовывает что-то вроде id или filters, хотя... Вероятно, он должен просто оставить default как есть... - person rid; 17.04.2013

В настоящее время не существует поддерживаемого способа сделать это. Я изменил имя свойства с default на другое, которое правильно переименовывается.

person rid    schedule 17.04.2013