2017-03-09 3 views
-2

Ich weiß nicht warum Element instanceof Node return false, da jedes Element, dessen nodeType 1 ist, ein spezieller Typ von Node ist. Warum `Element instanceof Node` false zurückgibt

Das folgende ist, was ich von MDN gefunden:

Folgende Schnittstellen alle von Knoten erben seine Methoden und Eigenschaften: Dokument, Element, Character (welche Text, Kommentar, und CDATASection vererben), ProcessingInstruction, Document Document, Notation, Entity, EntityReference

und Frage 2: warum in DOM jedes Element ist sowohl die instanceof Element und der instanceof Knoten.Verfahren Code ist unten:

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

Weil 'instanceof' testet, ob etwas eine ** Instanz ** von etwas ist. 'Element' ist keine Instanz. Es ist ein Konstrukteur. – Li357

+2

'Element instanceof Funktion 'wäre wahr. Um zu überprüfen, ob Klassen voneinander erben, siehe [hier] (http: // stackoverflow.com/a/35921495/1048572) – Bergi

+0

Beachten Sie, dass Browser die Prototypvererbung nicht unbedingt implementieren müssen. – RobG

Antwort

1

Element ist ein Function weil es ein Konstruktor ist.

Element.prototype ist ein Node.

da jedes Element, dessen nodeType 1 ist, ein spezieller Typ von Node ist.

Beachten Sie, dass Element.nodeType ist undefined, wie Element kein Node ist.

Warum sind Elemente im DOM beide Instanzen von Element und Node?

Die Prototyp-Kette ermöglicht es uns, Klassen im Wesentlichen zu definieren und definierte Klassen zu erweitern.

function Foo() {...} 

schafft, was eine Klasse von Foo

function Bar() {...} 

was kann eine Klasse von Bar

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

eine Beziehung schafft betrachtet schafft in Betracht gezogen werden, wo FooBar erstreckt.

Mit diesem Code, wenn Sie eine Foo Instanz erstellen:

var f = new Foo(); 

f ist eine Instanz Foo, und eine Instanz von Bar.

Die gleiche Hierarchie gilt für Element und Node, wobei ElementNode erweitert.

+0

Der DOM-Standard beschreibt eine Reihe von Schnittstellen (z. B. [interface ** Node **] (https://dom.spec.whatwg.org/#node), die in modernen Browsern unter Verwendung von Konstruktoren und der Prototypvererbung in Übereinstimmung mit ECMAScript implementiert sind. Die Interfaces * können jedoch * auf andere Weise implementiert werden und waren in der Vergangenheit, selbst dort, wo der Host Javascript unterstützt (zB IE bis mindestens Version 7), also könnte es kein globales * Element * -Objekt geben.) – RobG

Verwandte Themen