关于Node,Element,HTMLElement,Document,HTMLDocument,EventTarget

时间:2015-10-03 20:15:37

标签: javascript dom

我无法理解上述名称究竟代表什么。 MDN将它们称为interfaces。它们似乎都不是DOM nodes,因为不应用 parentNode nodeType 等属性,也不应用javascript对象。

另一方面,它们似乎是DOM对象的原型链:例如document-->HTMLDocument.prototype-->Document.prototype-->Node.prototype... 那么,究竟是什么?

最后,有些东西会让我发疯。我们来看 HTMLElement.prototype 。这是HTMLElement.prototype.hasOwnProperty('title')是真的。但是HTMLElement.prototype.title会在Chrome开发者工具中返回未捕获的TypeError:非法调用(...)!这个悖论有没有合理的解释?

谢谢

2 个答案:

答案 0 :(得分:1)

它们是对象(即Object类型的成员)。更具体地说,是主机对象(即由主机环境提供)。

没有悖论。

例如,在所有节点上,您都可以访问其parentNode。该属性不是每个节点的自有属性,而是从Node.prototype继承而来。属性Node.prototype.parentNode被定义为访问者属性(getter / setter)。

然后,当您执行document.body.parentNode之类的操作时,将使用document.body作为this值调用getter。但是,当您使用Node.prototype.parentNode时,getter会收到Node.prototype作为this值,而不是节点。所以它会抛出。

您也可以将它们称为"接口",因为它们在W3C规范中定义为IDL interfaces。例如,Node中定义了#menu-primary-menu{position:relative;} /*--Added--*/ #menu-primary-menu ul { width: 200px; background-color: red; position: absolute; /*---margin-top: 0;---- Removed*/ top:0; /*--Added--*/ left: 250px; }

答案 1 :(得分:0)

接口或原型声明。

要访问某物的属性,您需要一个实例。

在这种情况下,是HTMLElement的一个实例。 然后你可以查询HTMLElement.title。

请注意,在Javascript中,对象和接口实际上是函数,但并不总是被调用。