考虑以下两种创建对象实例的方法:
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, ...]
块括号让我感到困惑,我本来期待卷曲的。必须有一个解释,任何人都知道答案吗?
答案 0 :(得分:3)
听起来问题的关键在于确定Firebug如何显示您的对象。 Firebug检查传递给它的对象,并根据它们具有的属性选择如何将对象显示为字符串。
HTMLCollection是“类似数组”,因此它有一个length属性,并将其内容存储在名为0,1,2等的属性中。这使得它类似于数组,Firebug识别出这一点,输出对象的字符串表示形式就像它会是一个数组。
对于Firebug,如果它看到length
和splice
属性,它会将对象视为类似数组:
var MyArrayLike = function(){
this[0] = 1;
this.length = 1;
this.splice = function(){};
}
Firebug输出:
-> new MyArrayLike();
<- [1]