Резюме
Я хочу использовать class
в качестве имени свойства объекта и обращаться к нему с помощью записи через точку.
Преамбула
Я уже знаю, что согласно ECMA-262 5.1 Edition / июнь 2011 г. (номер страницы 19, страница 31), class
- это зарезервированное слово будущего:
7.6.1.2 Будущие зарезервированные слова
(...) Синтаксис
FutureReservedWord :: one of class enum extends super const export import
Но, согласно ECMA-262, издание 5.1 / июнь 2011 г. (номер страницы 17, страница 29), ограничение не быть ReservedWord
влияет только на Identifier
, но не на IdentifierName
:
7.6 Имена идентификаторов и идентификаторы
(...) Identifier — это IdentifierName, которое не является ReservedWord (см. 7.6.1). (...)
Синтаксис
Identifier :: IdentifierName but not ReservedWord
И, согласно ECMA-262, издание 5.1 / июнь 2011 г. (номер страницы 67, страница 79), имя свойства объекта представляет собой IdentifierName
вместо Identifier
:
11.2.1 Средства доступа к свойствам
Доступ к свойствам осуществляется по имени с использованием записи через точку:
MemberExpression . IdentifierName CallExpression . IdentifierName
или запись в скобках:
MemberExpression [ Expression ] CallExpression [ Expression ]
Точечная запись объясняется следующим синтаксическим преобразованием:
MemberExpression . IdentifierName
по своему поведению идентичен
MemberExpression [ <identifier-name-string> ]
Проблема
Проблема в том, что некоторые несовместимые браузеры выдают ошибку при использовании зарезервированных слов в качестве имен свойств:
var obj = {class: foo}; // error
var obj = {'class': foo}; // ok
obj.class; // error
obj['class']; // ok
Что я хочу
Конечно, я мог бы использовать скобочную нотацию вместо точечной, но с методами получается некрасиво, потому что скобок слишком много:
o.if().class('foo').implements('bar').use().native().interface() // looks good
o['if']()['class']('foo')['implements']('bar')['use']()['native']()['interface']() //ugly
Затем я хочу грязный хак (например, поведение HTC или что-то в этом роде), который при включении с использованием условных комментариев заставляет точечную запись работать с зарезервированными словами в IE8.