0

这让我很困惑,这是我的简单 html 文件:

<html>
    <head>
    </head>
    <body>
        <div id="misc">Test</div>
    </body>
</html>

在 Firebug 控制台中:我有这个脚本:

var c = document.documentElement.childNodes[2].childNodes[3];
alert(c.id); //Return misc
alert(c.constructor); // Return [object HTMLDivElement]

据我所知,函数的构造函数是一个函数(它也是一个对象,但我在这里不是在谈论那个函数对象)。现在 c 的构造函数是一个对象,如果我问 c'constructor 的构造函数(即 c.constructor.constructor),它现在将返回一个“真实”函数,如下所示:

function Object() {
    [native code]
} 

我不知道为什么 c.constructor 是一个对象( [object HTMLDivElement] ),它应该是一个预期的函数。你能帮我理解这个吗?谢谢!

4

1 回答 1

3

简短的回答是:c没有常规的构造函数。

更长的答案:DOM 元素、Function 对象、全局对象(通常window在浏览器中)、innerHTML 函数等原生对象没有常规构造函数。这是因为它们通常不是在 JavaScript 中实现的,而是在较低级别(以浏览器或解释器编写的任何语言)。

JavaScript 语言规范允许这样做 - 本机内置对象不必是普通的 javascript 对象。真正的原因是历史原因——规范基本上是由逆向工程 Netscape Navigator 编写的,并且所有贡献者都同意所写的内容。从那时起,每个人都只是为了向后兼容而坚持使用它。这些天通常给出的实际原因是性能:如果允许浏览器这样做,那么它们可以更快,因为本机对象不需要携带普通 JavaScript 对象的沉重包袱。


在您的特定情况下,DOM 元素没有常规构造函数。有两种方法可以“构造”DOM 对象:

  1. document.createElement(). 这是用于创建<div>s、<span>s 等的官方 DOM 方法。在大多数浏览器中,此方法不是普通的构造函数,因为 DOM 元素通常不会从其原型继承。

  2. innerHTML(). 这是一个访问浏览器的 HTML 编译器的瘦接口。它与浏览器用于解析常规网页的编译器相同。同样,这绝不是一个常规的构造函数,因为它甚至不返回它创建的对象。

由于 DOM 元素没有普通的构造函数,浏览器可能会为其constructor属性返回任何内容,包括什么也没有。您在案例中看到的主要是已泄漏到 javascript 引擎的实现细节。这不是您应该访问或使用的东西。更少依赖于开发应用程序。

于 2012-11-08T05:26:06.340 回答