javascript - JavaScript 中带有 'named' 构造函数的数组? (例如 HTMLCollection)

标签 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 时,我收到类似带有“命名”构造函数的数组之类的内容:

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

大括号让我困惑,我本来以为这里是大括号。对此必须有一个解释,有人知道答案吗?

最佳答案

听起来您问题的关键在于确定 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]

关于javascript - JavaScript 中带有 'named' 构造函数的数组? (例如 HTMLCollection),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31598490/

相关文章:

javascript - 无法弄清楚为什么 javascript 在我的 php 文件中不起作用

javascript - 如何在casperjs中评估后捕获屏幕?

javascript - 检查是否加载了动态添加的图像

使用选项/选择 HTML 表单标签的 PHP MySQL 多重搜索查询

php - 在浏览器中打开文件的最佳方式是什么

javascript - 如何让播放/暂停音乐按钮循环播放音乐?

javascript - 如何创建一个 Javascript 监听器,一旦 div 的子项都具有特定的类名,该监听器就会触发事件

javascript - MomentJS:使用默认字符串而不是自定义字符串

html - CSS 关键帧动画在 Firefox 中不起作用(我看过其他答案)

jquery - 尝试将链接锚定在页内滚动条内容的中心