JavaScript中的Document和document有什么区别?

时间:2013-05-28 10:50:29

标签: javascript dom

我目前正在为JavaScript构建一个API,主要使用Visual Studio 2010和JetBrains WebStorm(如果您正在寻找一个防弹JavaScript IDE,那就太棒了。)

在查看Visual Studio中的intellisense列表(尝试熟悉JavaScript API)时,我注意到Documentdocument都存在。

  1. Documentdocument之间的区别是什么?
  2. document什么是实例(如果有的话)?
  3. 如何使用Document(因为它不是函数,因此不可构造)?
  4. 最重要的是,“猴子修补”Document使其可以构建的危害是什么?
  5. 这些问题背后的基本原理是我想创建一些适合我的API的对象(例如; DocumentHTMLElement等),但因为这些似乎已经存在于某些方面,我不相信我应该覆盖他们的原生实现。

2 个答案:

答案 0 :(得分:15)

  

Documentdocument之间的区别是什么?

document(或window.document)是对窗口中包含的文档的引用。 (spec

Document是文档的DOM接口,它在全局对象上公开。 (specspec

  

如何使用Document(因为它不是函数,因此不可构造)?

它是一个主机对象,不需要遵循EcmaScript规范 - 但这并不意味着它不是一个功能。它可能因浏览器而异。然而,它并不打算被调用(如果你尝试它将获得NOT_SUPPORTED_ERR),还有其他方法来实例化/获取新文档。您仍然可以使用它的是

> document instanceof Document
true
> Document.prototype
DocumentPrototype {
    adoptNode: Function
    constructor: Document
    createAttribute: Function
    …
    querySelector: Function
    querySelectorAll: Function
}
|- NodePrototype
|- Object

因此您可以扩展其原型并在应用中的所有XMLDocuments / HTMLDocuments上使用这些方法(但前提是您知道what’s wrong with extending the DOM)。

  

最重要的是,“猴子修补”Document对构建它有什么害处?

我不确定你会怎么做。覆盖它可能会损害每个希望它按上述方式工作的脚本(除非你修复了新函数的prototype属性)。也许Document的{​​{1}}属性在某些环境中是不可写的,因此您可能会伤害自己。

答案 1 :(得分:1)

  1. Document是全局范围的document对象的原型定义。这意味着Document的原型与他的实例共享(document )。例如Windowwindow对象的原型定义。
  2. Document是本机原型对象,您无法创建它的实例,在创建页面时(再次像窗口一样)只创建一个实例,就像单个音色对象一样。 / LI>
  3. 我不认为覆盖Document将是一个很好的做法。
  4. 我的建议是为API使用命名空间,并在api命名空间内创建Document和HTMLElement等,例如:

    var api = {
        Document: { /* your implementation */ },
        HTMLElement: { /* your implementation */ }
        //...
    };
    
    var myDocument = new api.Document();
    

    然后,你可以继承真正的Document原型并在你自己的对象中使用它,如下所示:

    api.Document = function(){ /* your implementation */ }
    api.Document.prototype = Document.prototype;
    
    var myDocument = new api.Document();
    

    希望这是有帮助的,我理解你的问题......