我正在尝试让网站在 ie8 上运行。
我找到了以下js代码:
var autocompleteAddressController=(function(){
var my={};
//...
my.new=function(val){
//...
};
});
在另一个文件中:
var address = autocompleteAddressController.new("#user_address_name");
//...
这在最新的浏览器(chrome 和 safari)中运行良好
但它在 ie8 上崩溃了。我猜测 ie8 的 javascript 解析器不支持我们为自定义函数使用保留名称“new”,因此在控制台中出现错误:这些表达式上的 expectedidentifier
:my.new=function
和 autocompleteAddressController.new
。
- 你应该这样做吗?
- 它会覆盖
new
运算符还是只是在对象上创建一个函数(就像我的示例中使用的那样)?
最佳答案
Will it override the
new
operator
没有。您无法覆盖 JavaScript 中的运算符。
代码所做的就是创建 my
的一个方法,该方法恰好具有标识符 new
。这在所有环境中都有效,但仅在 ES5 中通过点表示法使用保留字作为属性标识符才有效。您可以通过使用方括号使其在 IE8 和其他非 ES5 环境中工作:
my["new"] = function (val) { /*...*/ }
// And in your other file...
var address = autocompleteAddressController["new"]("#user_address_name");
<小时/>
更新
为了稍微扩展一下这一点,这里是 ES5 语法的相关部分。首先,这是 Identifier production :
Identifier ::
IdentifierName but not ReservedWord
请注意,标识符不能是保留字(new
是保留字)。 IdentifierName 产生式仅指定标识符中允许使用的字符(没有基于保留字的限制)。
以下是“object initialisers”(对象文字)中属性的语法:
PropertyName :
IdentifierName
StringLiteral
NumericLiteral
请注意,它指的是IdentifierName,而不是Identifier。这是允许使用保留字作为属性标识符的产生式。
最后,将该结果与 older ES3 spec 中的结果进行比较:
PropertyName :
Identifier
StringLiteral
NumericLiteral
这一次,它使用Identifier,而不是IdentifierName。由于 Identifier 生成方式不允许使用保留字,因此该代码在 ES3 环境中无效。
关于javascript - 你能在 javascript 中重载 new 运算符吗?它会做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15966896/