JavaScript中带有“命名”构造函数的数组? (例如HTMLCollection)

时间:2015-07-23 21:38:29

标签: javascript html

考虑以下两种创建对象实例的方法

function f() { return { k: 'v'} }
var inst1 = f();

function F() { this.k = 'v'; } 
var inst2 = new F();

inst1和inst2的行为是相同的,唯一的区别是不同的构造函数被保存到对象中:

inst1.constructor; // Object()
inst2.constructor; // F()

数组的构造函数是什么?参见:

var xs = [];
xs.constructor; // Array()

在此之前我理解逻辑。但我碰到了以下内容:

var tags = document.getElementsByTagName("*");
typeof tags; // object
tags.constructor; // HTMLCollection()

到目前为止,它与inst2示例类似。但是当我用Firebug调试console.log时,我会收到类似于带有'named'构造函数的数组:

console.log(tags); // HTMLCollection[tag1, tag2, ...]

块括号让我感到困惑,我本来期待卷曲的。必须有一个解释,任何人都知道答案吗?

1 个答案:

答案 0 :(得分:3)

听起来问题的关键在于确定Firebug如何显示您的对象。 Firebug检查传递给它的对象,并根据它们具有的属性选择如何将对象显示为字符串。

HTMLCollection是“类似数组”,因此它有一个length属性,并将其内容存储在名为0,1,2等的属性中。这使得它类似于数组,Firebug识别出这一点,输出对象的字符串表示形式就像它会是一个数组。

对于Firebug,如果它看到lengthsplice属性,它会将对象视为类似数组:

var MyArrayLike = function(){
    this[0] = 1;
    this.length = 1;
    this.splice = function(){};
}

Firebug输出:

-> new MyArrayLike();
<- [1]