javascript - 你能在 javascript 中重载 new 运算符吗?它会做什么?

标签 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”,因此在控制台中出现错误:这些表达式上的 expectedidentifier:my.new=functionautocompleteAddressController.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/

相关文章:

javascript - 使用可变数量的参数调用类对象

c - 为什么函数在没有指定返回类型的情况下有返回值?

C++:如果我重载 new 运算符,我是否也必须重载 delete 运算符?

javascript - 使用 Chrome 扩展检测框架或字符串的语言?

javascript - 获取对象内部的函数名称

javascript - 从对象列表中获取所有可能的对象键 Javascript/TypeScript

c++ - 创建新结构、插入列表、重新使用指针、在 vector 中返回……是否以及如何删除?

javascript - 使用 Graph API 无法使用过滤器参数获取特定日期的事件

javascript - 如何在 setInterval/setTimeout 函数中按名称调用函数?

c++ - 在 C++ 中分配内存而不初始化它