你可以在javascript中重载新的运算符吗?它会做什么?

时间:2013-04-12 08:49:02

标签: javascript function new-operator

我正在努力让网站在ie8上运作。

我找到了以下js代码:

var autocompleteAddressController=(function(){
  var my={};
  //...

  my.new=function(val){
    //...
  };
});

在另一个档案中:

var address = autocompleteAddressController.new("#user_address_name"); 

//...

这在最近的浏览器(chrome和safari)中运行良好

但它打破了ie8。我猜测ie8的javascript解析器不支持我们为自定义函数使用保留名称“new”,所以在控制台中我对这些表达式有expected identifier错误:my.new=functionautocompleteAddressController.new

  • 你应该这样做吗?
  • 它是否会覆盖new运算符,或者只是在对象上创建一个函数,就像我在我的示例中使用的一样?

1 个答案:

答案 0 :(得分:6)

  

是否会覆盖new运算符

没有。您无法在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

  

标识符 ::
   IdentifierName 但不是 ReservedWord

请注意,标识符不能是保留字(new是保留字)。 IdentifierName 生产只是指定标识符中允许的字符(没有基于保留字的限制)。

以下是“object initialisers”(对象文字)中属性的语法:

  

PropertyName
   IdentifierName
  串文字
   NumericLiteral

请注意,它引用 IdentifierName ,而不是 Identifier 。这是允许使用保留字作为属性标识符的制作。

最后,将该产品与older ES3 spec中的产品进行比较:

  

PropertyName
  标识符
  串文字
   NumericLiteral

这一次,它使用标识符,而不是 IdentifierName 。由于 Identifier 生产不允许使用保留字,因此ES3环境中的代码无效。