javascript - 数组创建,为什么会这样?

标签 javascript

我明白为什么:

 output = new Array();

 output = [];

但为什么这样行得通呢?

 output = Array();

最佳答案

Array() 构造函数的实现很简单,因此无需使用 new 调用它。这是其语义定义的一部分。

Array() 等内置构造函数(可能)不是用 JavaScript 编写的,但您可以在自己的代码中获得相同的效果:

function MyConstructor() {
  "use strict";
  var newObj = this || {};

  // ...

  return newObj;
}

当您使用 new 调用时,构造函数将看到它已绑定(bind)到 this。如果你不这样做,那么 this 将是未定义的(因为“use strict”;你也可以检查 this 是否是全局对象,你会必须为旧的 IE 做)。

构造函数的返回值不是 new 表达式的值——它始终是新创建的对象。但是,当您在没有 new 的情况下调用它时,将使用返回值。

edit — RobG 在评论中指出,要使其真正正常工作,需要显式设置函数创建的“合成”newObj,以便它有合适的原型(prototype)等。这有点棘手;代码简单地执行此操作可能是最简单的:

function MyConstructor() {
  "use strict";
  if (!this) return new MyConstructor();
  // ... or possibly using "apply" if you need parameters too
}

T.J. Crowder 在这里写了一些关于对象/继承争论的精彩回答。

关于javascript - 数组创建,为什么会这样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13463811/

相关文章:

javascript - 如何根据单击的按钮发送 id 参数?

javascript - 在 for 循环中设置对象值,然后推送到数组会导致所有最终数组项具有相同的值

javascript - 添加带有循环的目标属性

javascript - 带有 ajax 调用的 asp.net Web 表单返回 ienumerable

javascript - AngularJS ng-options,使用 <select> 中的键值对

javascript - 在什么条件下链接的 jQuery 对象提供性能提升?

javascript - 在导航样式上使用 getElementById?

javascript - 为什么 Object.keys(window) 或 for(k in window) 不返回 Math?

javascript - 为什么在 JavaScript 注释中使用 '@' - @param

javascript - 无法从子目录中找到模块 windows 10