1

我明白为什么:

 output = new Array();

 output = [];

但为什么这行得通?

 output = Array();
4

4 回答 4

3

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

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

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

  // ...

  return newObj;
}

当你调用 withnew时,构造函数会看到它绑定了一些东西this。如果您不这样做,那么this将是未定义的(因为“使用严格”;您也可以检查是否this是全局对象,对于旧 IE,您必须这样做)。

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

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

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

TJ Crowder 在这里就对象/继承争论的主题写了一些很棒的答案。

于 2012-11-19T22:57:13.850 回答
1

Array()可以编写一个函数来检测它是否在没有new运算符的情况下被调用,如果new被省略,则会自动创建一个新对象然后返回它。

于 2012-11-19T22:57:06.083 回答
0

简单的答案是“因为 ECMA-262 这么说”。实时调频。

第一个调用Array 函数作为构造函数,第二个是Array 初始化器(又名 Array 字面量)。

第三种是将Array函数作为函数调用,等价于new Array()and []

于 2012-11-19T22:58:14.997 回答
0

output = Array() 有效,因为 Array 是一个函数。

运行这个 cod3

<script>
var a = new Array();
var b = Array();
a[0] = 123;
b[0] = 32;
alert("a = " + a +"\nb = " +b +", " + Array);
</script>

这打印出来:

a = 123
b = 32, function Array() {
    [native code]
}

所以,既然 Array 是一个函数,你可以调用 Array(),它的实现就是给你一个 new Array()

于 2012-11-19T23:00:44.207 回答