В чем разница между документом и документом в JavaScript?
В настоящее время я создаю API для JavaScript, преимущественно используя Visual Studio 2010 и JetBrains WebStorm (блестящий, если вы ищете пуленепробиваемый JavaScript IDE).
Просматривая список intellisense в Visual Studio (пытаясь ознакомиться с JavaScript API), я заметил, что существуют как Document
, так и Document
.
- В чем разница между
Document
и Document
?
- Что такое
Document
экземпляр (если есть)?
- Как использовать
Document
(поскольку он не является функцией, следовательно, не конструируется)?
- Самое главное, что вредно для "обезьян-патчей"
Document
, чтобы сделать его конструктивным?
Обоснованием этих вопросов является то, что я хочу создать некоторые объекты, которые вписываются в мой API (например, Document
, HTMLElement
и т.д.), но поскольку они, похоже, уже существуют в некотором отношении, я не уверен, что я должен переписать свою собственную реализацию.
Ответы
Ответ 1
В чем разница между 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
в своем приложении (но только если вы знаете что не так с расширением DOM).
Самое главное, какой вред для "обезьян-патчей" Document
сделать его конструктивным?
Я не уверен, как вы это сделаете. Перезапись может повредить каждому script, который ожидает, что он будет работать, как указано выше (если вы не исправите свойство prototype
своей новой функции). И, возможно, свойство Document
window
недоступно для записи в некоторых средах, поэтому вы можете навредить себе.
Ответ 2
-
Document
- это определение прототипа для объекта Document
объекта глобальной видимости означает, что прототип Document
делится с его экземпляром (Document
). например Window
- это определение прототипа для объекта Window
.
-
Document
- это собственный объект-прототип, и вы не можете создавать его экземпляры, создается только один экземпляр, когда страница создается (опять же, как и окно) точно так же, как один тонный объект.
- Я не думаю, что переопределить
Document
будет хорошая практика.
Мое предложение - использовать пространство имен для вашего API и создать документ и HTMLElement и т.д. внутри вашего пространства имен api, например:
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();
Надеюсь, что это помощь, и я понял, что вы сомневаетесь...