我想使用class
作为对象的属性名称,并使用点表示法访问它。
我已经知道,根据ECMA-262 5.1 Edition / June 2011(第19页,第31页),class
是未来保留字:
7.6.1.2未来保留字
(...) 的语法
FutureReservedWord :: one of class enum extends super const export import
但是,根据ECMA-262 5.1 Edition / June 2011(第17页,第29页),不是ReservedWord
的限制只会影响Identifier
,而不影响IdentifierName
:
7.6标识符名称和标识符
(...)标识符是不是ReservedWord的IdentifierName (见7.6.1)。 (...)
语法
Identifier :: IdentifierName but not ReservedWord
根据ECMA-262 5.1 Edition / June 2011(第67页,第79页),对象属性名称是IdentifierName
而不是Identifier
:
11.2.1属性访问者
使用点表示法按名称访问属性:
MemberExpression . IdentifierName CallExpression . IdentifierName
或括号表示法:
MemberExpression [ Expression ] CallExpression [ Expression ]
点符号由以下语法转换解释:
MemberExpression . IdentifierName
与
的行为完全相同MemberExpression [ <identifier-name-string> ]
问题是some non-compliant browsers在使用保留字作为属性名时会抛出错误:
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上使用保留字。