W3schools array article读取
如果对象是由给定构造函数
创建的,则var fruits = ["Banana", "Orange", "Apple", "Mango"]; fruits instanceof Array // returns true
运算符返回true
constructor
但我不确定上面代码中的Array()
是哪一个。是[]
吗?这是否意味着数组文字new Array()
是folders:
的快捷方式?
答案 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
尽管使用不同的构造函数构造了f
和g
,但它们都被视为F
和G
的实例。原因是F
和G
都有相同的原型。
那么,构造函数在任何意义上都有用吗?
除了这两个之外,没有更多的用途可以想到。
为什么所有这些都与我的问题有关?
正如其他答案中所指出的,Array()是[]的构造函数,而prototype是不可写的,因此您在同一窗口中执行该检查不会有任何问题/帧。
然而,有一个警告。如果您的webapp使用多个窗口或框架,则必须考虑每个窗口或框架是不同的执行上下文,并且每个窗口或框架都有自己的全局对象和自己的构造函数集。在两个不同的帧中创建的两个数组继承自两个相同但不同的原型对象,并且在一个帧中创建的数组不是另一个帧的Array()构造函数的实例。