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

IT技术 javascript dom
2021-01-17 17:27:42

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

在查看 Visual Studio 中的智能感知列表(试图让自己熟悉 JavaScript API)时,我注意到Document和 都document存在。

  1. Document和 和有什么不一样document
  2. 什么是document(如果有)的实例?
  3. 如何使用Document(因为它不是函数,因此不可构造)?
  4. 最重要的是,“猴子补丁”Document使其可构建有什么危害

这些问题背后的理由是,我想创造一些对象适合我的API(例如; DocumentHTMLElement等),但这些似乎在某些方面已经存在,我不相信,我应该重写他们的母语执行。

2个回答

Document和 和有什么不一样document

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

Document是文档的 DOM 接口,它暴露在全局对象上。规格规格

如何使用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(但前提是你知道扩展 DOM 有什么问题)。

最重要的是,“猴子补丁”Document使其可构建有什么危害

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

所以基本上Document.prototype本质上类似于window.document/ document
2021-04-02 17:27:42
@Jaketr00:类似?当然。事实上,Document.prototype.isPrototypeOf(window.document)true:-)
2021-04-09 17:27:42
  1. Documentdocument全局作用域对象的原型定义,意味着Document的原型与他的实例 ( document)共享就像Windowwindow对象的原型定义
  2. Document是原生原型对象,您不能创建它的实例,在创建页面时(同样,就像窗口一样),只会创建一个实例,就像单色调对象一样。
  3. 我不认为覆盖Document将是一个好习惯。

我的建议是为你的 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();

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