2017-03-09 100 views
-2

我不知道为什么Element instanceof Node返回false,因为nodeType为1的任何元素都是特殊类型的节点。为什么`Element instanceof Node`返回false

以下是我从MDN发现:

以下接口都从节点继承其方法和属性:文档,元素,CharacterData(该文本,注释和CDATASection的继承)的ProcessingInstruction,DocumentFragment的,DocumentType,符号,实体的EntityReference

而且问题2:为什么在DOM任何元素既是instanceof的元素和instanceof的Node.The代码如下:

var div = document.querySelector("div"); 
div instanceof Node;//true 
div instanceof Element;//true 
Element instancof Node;//false 
+2

因为'instanceof'测试是否某物是**实例**。 'Element'不是一个实例。这是一个构造函数。 – Li357

+2

'Element instanceof Function'将成立。要检查类是否相互继承,请参见[here](http:// stackoverflow。com/a/35921495/1048572) – Bergi

+0

请注意,浏览器不一定要实现原型继承。 – RobG

回答

1

ElementFunction,因为它是一个构造函数。

Element.prototypeNode

因为nodeType为1的任何元素都是特殊类型的节点。

注意Element.nodeTypeundefined,如Element不是Node

为什么DOM中的元素都是元素和节点的实例?

原型链允许我们基本上定义类和扩展定义的类。

function Foo() {...} 

产生什么可以被认为是一类Foo

function Bar() {...} 

将创建什么可以被认为是一类Bar

Foo.prototype = new Bar(...); 

创建其中Foo延伸Bar的关系。

使用此代码,如果你创建一个Foo实例:

var f = new Foo(); 

fFooBar实例的实例。

相同的等级适用于ElementNode,其中Element延伸Node

+0

DOM标准描述了一系列接口(例如[interface ** Node **](https://dom.spec.whatwg.org/#node),这些接口在现代浏览器中使用构造函数实现,原型继承与ECMAScript一致。然而,即使在主机支持javascript的情况下(例如IE至少为7版本),接口*可以以其他方式实现并且已经在过去,所以可能不存在全局的* Element *对象; ) – RobG