构造函数不是函数而是对象

时间:2012-11-08 04:55:15

标签: javascript

这让我非常困惑,这是我简单的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]),它应该是一个预期的函数。 你能帮我理解这个吗? 谢谢!

1 个答案:

答案 0 :(得分:3)

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

答案越长:DOM元素,Function对象,全局对象(浏览器中通常为window),innerHTML函数等本机对象都没有常规构造函数。这是因为它们通常不是用JavaScript实现的,而是用较低的级别实现的(无论用什么语言编写浏览器或解释器)。

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


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

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

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

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