document.doctype instanceof DocumentType // true
document.doctype instanceof Node // true
Object.getPrototypeOf(document.doctype) == DocumentType.prototype // true
typeof document.doctype["remove"] // "function"
document.doctype instanceof ChildNode // ReferenceError: ChildNode is not defined
Как вы можете видеть, экземпляр доктайпа имеет метод, определенный ChildNode
в спецификации, но поскольку Javascript не поддерживает множественное наследование, это не представимо через систему типа.
В других языках программирования множественное наследование или поддержка для микшинов в системе типов будет использоваться для кодирования отношения.
Цепь конкретных объектов прототипа выглядит следующим образом, по крайней мере в Firefox:
document.doctype ->
DocumentType.prototype ->
Node.prototype ->
EventTarget.prototype ->
Object.prototype ->
null
ChildNode
В методах, как представляется, вводит в DocumentType.prototype
.
So * реализует * здесь означает * «Все методы из ChildNode есть, но не по наследованию, а добавлены вручную». *? И до последней ошибки. Правильно ли я понимаю, что браузеры создают объект Node, который реализует интерфейс Node, а ChildNode - это просто интерфейс без соответствующего объекта? –
Более или менее. Точный язык зависит от того, кого вы спрашиваете. спецификация DOM рассказывает о интерфейсах. Языки, реализующие DOM, имеют разные концепции наследования. Некоторые языки имеют множественное наследование для полных классов, одно единственное наследование + mixins или абстрактные интерфейсы. Javascript использует основанное на прототипе наследование (и ES6 вводит классы, построенные поверх этого). Таким образом, эти вещи будут выражаться по-разному в системах на языке C++ или Java, например. – the8472
О 'Node', это функция-конструктор, соответствующая прототипу предка. Он в основном существует, поэтому «экземпляр» и другие вещи отражают работу. – the8472