Was ist der Unterschied zwischen isPrototypeOf und instanceof in Javascript?
In einige meiner eigenen älteren code verwende ich das folgende:
Object.prototype.instanceOf = function( iface )
{
return iface.prototype.isPrototypeOf( this );
};
Dann mache ich (zum Beispiel)
[].instanceOf( Array )
Dies funktioniert, aber es scheint, das folgende würde das gleiche tun:
[] instanceof Array
Nun, sicherlich ist dies nur ein sehr einfaches Beispiel. Meine Frage ist daher:
Ist a instanceof b
IMMER das gleiche wie b.prototype.isPrototypeOf(a)
?
- Während Sie können immer
instanceof
(mit Konstruktoren auf die Rechte Seite), nicht alle Objekte, die möglicherweise Erben vonObject.prototype
.Object.create(null) instanceof Something
und({}).instanceOf({prototype:Something.prototype})
arbeiten (und Ertragfalse
), wo das Gegenteil würde scheitern.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja, Sie tun das gleiche, beide Durchlaufen bis der Prototyp-Kette suchen nach einem bestimmten Objekt.
Den Unterschied zwischen den beiden ist , was Sie, und wie Sie Sie nutzen können, z.B. die
isPrototypeOf
ist eine Funktion verfügbar auf derObject.prototype
Objekt ist, können Sie testen, ob ein bestimmtes Objekt ist in der Prototyp-Kette von dem anderen, da diese Methode definiertObject.prototype
es ist für alle Objekte verfügbar.instanceof
ist ein operator und Sie erwartet zwei Operanden, ein Objekt und eine Konstruktor-Funktion, es zu testen, ob die übergebene Funktionprototype
Eigenschaft vorhanden ist, an der Kette des Objekts (über die[[HasInstance]](V)
interne operation, die nur in Funktions-Objekte).Beispiel:
C.prototype.clazz = C;
hart.) Warum machen die Leute das set-Konstruktor?B.prototype.constructor = B
und prüfen der Konstruktor einer Instanz von B:alert((new B).constructor)
und du wirst sehen, das Eine Konstruktor-Funktion. Indem er das tut, er versichert sich selbst zu finden, wie ein Konstruktor, der alle Instanzen von B, nur B.instanceof
ist vor allem für die pseudo-klassische Vererbung, wie es stützt sich aufB.prototype
, undB
, das ist ein "Konstruktor". Was also, wennB.prototype
undB
nicht verwendet werden, so gibt es keinen Konstruktor, wenn das JavaScript-Programm geschrieben wird, streng in einer prototypal inheritance Weg? In diesem Fall, dannanimal.isPrototypeOf(woofie)
verwendet werden kanninstanceof
funktioniert nicht, wenn Sie nicht über eine Konstruktor-Funktion, z.B.Object.create
. Scheint mit allerlei anderen Problemen: tobyho.com/2011/01/28/checking-types-in-javascriptNein,
a instanceof b
wird nicht immer Verhalten sich genauso wieb.prototype.isPrototypeOf(a)
.CMS' Antwort wies darauf hin, dass Sie unterscheiden sich in , was Sie (ist ein operator und das andere ist eine integrierte Methode zur Verfügung, die auf die
Object.prototype
Objekt). Das ist richtig, allerdings gibt es auch einige spezielle Fälle, für diea instanceof b
wird in einemTypeError
währendb.prototype.isPrototypeOf(a)
gut funktionieren und Umgekehrt.Unterschied #1
Der rechten Seite der
instanceof
wird erwartet, dass eine Konstruktor-Funktion.Wenn
b
ist nicht eine Funktion:a instanceof b
wird in einemTypeError
.b.prototype.isPrototypeOf(a)
gut funktionieren wird.JS:
Unterschied #2
Bei der Verwendung
b.prototype.isPrototypeOf(a)
,b.prototype
werden sollen Erben vonObject.prototype
:Wenn
b.prototype
hat keinen Zugriff auf dieObject.prototype.isPrototypeOf()
Methode:b.prototype.isPrototypeOf(a)
wird in einemTypeError
.a instanceof b
gut funktionieren wird.JS:
Unterschied #3
Wenn die Rechte Seite von
instanceof
ist eine Funktion gebunden, es ist äquivalent behandelt, um seine Ziel-Funktion.Wenn b eine gebundene Funktion:
a instanceof b
gut funktionieren wird.b.prototype.isPrototypeOf(a)
wird in einemTypeError
(bound-Funktion nicht über eineprototype
Eigenschaft).JS:
Abschluss
Object.create()
, ohne die Verwendung von Konstruktoren, sollten Sie wahrscheinlich dieObject.prototype.isPrototypeOf()
Methode (denn in der Tat Fälle voninstanceof
sind mehr beschränkt, dassinstanceof
erwartet der rechten Seite parameter einen Konstruktor-Funktion).instanceof
Betreiber (Sie werden in der Lage, Einband Funktionen, sowie die Fälle, in denenObject.prototype
liegt nicht in der Prototyp-Kette vonConstructor.prototype
).Object.prototype.isPrototypeOf.call(B.prototype, a)
Rangfolge und truthiness abweichen, da ist ein Ausdruck und die andere ist eine Methode aufrufen. Eine Sache zu betonen ist, dass sowohl traverse der Prototyp-Kette, so dass Sie können nicht davon ausgehen, dass es eine eins-zu-eins-Zuordnung zwischen ein-matching-Prototyp und Objekt in Frage:
JS:
Referenzen