我目前正在为JavaScript构建一个API,主要使用Visual Studio 2010和JetBrains WebStorm(如果您正在寻找一个防弹JavaScript IDE,那就太棒了。)
在查看Visual Studio中的intellisense列表(尝试熟悉JavaScript API)时,我注意到Document
和document
都存在。
Document
和document
之间的区别是什么?document
什么是实例(如果有的话)?Document
(因为它不是函数,因此不可构造)?Document
使其可以构建的危害是什么?这些问题背后的基本原理是我想创建一些适合我的API的对象(例如; Document
,HTMLElement
等),但因为这些似乎已经存在于某些方面,我不相信我应该覆盖他们的原生实现。
答案 0 :(得分:15)
Document
和document
之间的区别是什么?
document
(或window.document
)是对窗口中包含的文档的引用。 (spec)
Document
是文档的DOM接口,它在全局对象上公开。 (spec,spec)
如何使用
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)
Document
是全局范围的document
对象的原型定义。这意味着Document
的原型与他的实例共享(document
)。例如Window
是window
对象的原型定义。Document
是本机原型对象,您无法创建它的实例,在创建页面时(再次像窗口一样)只创建一个实例,就像单个音色对象一样。 / LI>
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();
希望这是有帮助的,我理解你的问题......