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

Ben*_*ier 0 javascript function new-operator

我想在ie8上建立一个网站.

我找到了以下js代码:

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

  my.new=function(val){
    //...
  };
});
Run Code Online (Sandbox Code Playgroud)

在另一个文件中:

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

//...
Run Code Online (Sandbox Code Playgroud)

这在最近的浏览器(铬和野生动物园)中工作正常

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

  • 你应该这样做吗?
  • 它会覆盖new运算符还是仅仅在我的示例中使用的对象上创建一个函数?

Jam*_*ice 6

它会覆盖new运营商吗?

不可以.您无法在JavaScript中覆盖运算符.

所有代码都是创建一个my恰好具有标识符的方法new.这在所有环境中都有效,但仅在ES5中通过点符号将保留字用作属性标识符才有效.您可以使用方括号使其在IE8和其他非ES5环境中工作:

my["new"] = function (val) { /*...*/ }

// And in your other file...

var address = autocompleteAddressController["new"]("#user_address_name");
Run Code Online (Sandbox Code Playgroud)

更新

稍微扩展一下,这里是ES5语法的相关部分.首先,这是标识符生产:

Identifier ::
    IdentifierName但不是ReservedWord

请注意,标识符不能是保留字(new是保留字).所述IdentifierName生产直接指定了被允许在一个标识符(没有基于保留字限制)的字符.

这是" 对象初始化器 "(对象文字)中属性的语法:

PropertyName:
    IdentifierName
    StringLiteral
    NumericLiteral

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

最后,将该产品与旧版ES3规范中的产品进行比较:

PropertyName:
    Identifier
    StringLiteral
    NumericLiteral

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