数组文字中的构造函数是什么?

时间:2016-10-06 08:50:53

标签: javascript arrays

W3schools array article读取

  

如果对象是由给定构造函数

创建的,则var fruits = ["Banana", "Orange", "Apple", "Mango"]; fruits instanceof Array     // returns true 运算符返回true
constructor

但我不确定上面代码中的Array()是哪一个。是[]吗?这是否意味着数组文字new Array()folders:的快捷方式?

3 个答案:

答案 0 :(得分:2)

是的,[1,2]等于new Array(1,2)。根据{{​​3}}:

Syntax

[element0, element1, ..., elementN]
new Array(element0, element1[, ...[, elementN]])
new Array(arrayLength)

答案 1 :(得分:2)

本主题已在W3C JavaScript Array constructor Property上记录:

  

构造函数属性返回数组的构造函数:

var fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.constructor;
     

构造函数属性返回:

function Array() { [native code] }

如您所见,Array()是构造函数。

是的,这意味着[]文字和Array()构造函数的目的基本相同,尽管this StackOverflow post已经指出了差异。

答案 2 :(得分:0)

实际上,这个定义有点令人困惑。

instanceof 运算符实际上并不检查对象是否是由构造函数创建的。它检查构造函数原型中是否继承(继承不需要直接)。

差异很微妙,但很重要。让我详细说明一下:

想象一下,我们有两个构造函数,两者都有相同的原型:

var F = function() {};
var G = function() {};
var FakeConstructor = function() { this.name = "FakeConstructor"; };
var obj = {};

F.prototype = obj;
G.prototype = obj;
// F prototype and G prototype are the very same object. We set the constructor to FakeConstructor just to point out that it is irrelevant for the instanceof operator
G.prototype.constructor = FakeConstructor;

var g = new G();
var f = new F();

f instanceof F;// true
f instanceof G;// true
g instanceof F;// true
g instanceof G;// true

尽管使用不同的构造函数构造了fg,但它们都被视为FG的实例。原因是FG都有相同的原型。

那么,构造函数在任何意义上都有用吗?

  1. 它可以被认为是"公共身份"该类(正如你所看到的,instanceof强化了这一事实)虽然原型是基本身份。
  2. 可以用作对创建对象的构造函数的引用(尽管你必须小心并正确设置它)。
  3. 除了这两个之外,没有更多的用途可以想到。

    为什么所有这些都与我的问题有关?

    正如其他答案中所指出的,Array()是[]的构造函数,而prototype是不可写的,因此您在同一窗口中执行该检查不会有任何问题/帧。

    然而,有一个警告。如果您的webapp使用多个窗口或框架,则必须考虑每个窗口或框架是不同的执行上下文,并且每个窗口或框架都有自己的全局对象和自己的构造函数集。在两个不同的帧中创建的两个数组继承自两个相同但不同的原型对象,并且在一个帧中创建的数组不是另一个帧的Array()构造函数的实例。