Warum in JavaScript sowohl "Objekt instanceof-Funktion" und "Funktion instanceof Objekt" true " zurück?
Warum in JavaScript nicht beide Object instanceof Function
und Function instanceof Object
zurück true
?
Versuchte ich es in Safari WebInspector.
Funktionen sind Objekte, nicht alle Objekte sind Funktionen. Instanz prüft die Arbeit an Fällen - Sie prüfen die Konstruktoren, die sich Funktionen.
Ich wäre neugierig zu wissen, was für ein Ergebnis Sie erwarten.
von der Frage, OP erwartet ein isPrototypeOf überprüfen.
Wo in der Frage seht Ihr das?
Im subtext, aus der Tatsache, OP ist überrascht, dass Objekt instanceof-Funktion.
Ich wäre neugierig zu wissen, was für ein Ergebnis Sie erwarten.
von der Frage, OP erwartet ein isPrototypeOf überprüfen.
Wo in der Frage seht Ihr das?
Im subtext, aus der Tatsache, OP ist überrascht, dass Objekt instanceof-Funktion.
InformationsquelleAutor dinghao | 2014-05-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es dauerte eine Weile für mich, um herauszufinden, aber die wirklich Wert die Zeit verbrachte. Erste, lassen Sie uns sehen, wie
instanceof
funktioniert.Zitat aus MDN,
[instanceof]
Nun, lassen Sie uns sehen, wie
instanceof
ist definiert durch ECMA 5.1 Spezifikation,Erste, der linken und der rechten Seite Ausdrücke ausgewertet werden (
GetValue
) und dann mit der rechten Seite Ergebnis sollte ein Objekt mit[[HasInstance]]
interne Methode. Nicht alle Objekte haben[[HasInstance]]
interne Methode, funktioniert aber. Zum Beispiel, die folgenden fehl[[HasInstance]]
Nun, lassen Sie uns sehen, wie
[[HasInstance]]
definiert wurde, in der ECMA 5.1 Spezifikation,Es ist so einfach. Nehmen Sie die
prototype
Eigenschaft vonF
und vergleichen Sie es mit der[[Prototype]]
interne Eigenschaft vonO
bis es zunull
oderprototype
vonF
ist das gleiche wieO
.[[prototype]]
interne EigenschaftLasst uns zuerst sehen, was ist das
[[prototype]]
interne Eigenschaft,Hinweis: Wir können dieses internen Eigenschaft mit dem
- Objekt.getPrototypeOf
Funktion.prototype
Eigenschaft[[HasInstance]]
spricht auch über eine andere Eigenschaft genanntprototype
, die sich speziell auf dasFunction
Objekte.Dies bedeutet, dass, wenn eine function-Objekt wird verwendet, wie ein Konstruktor, der ein neues Objekt erstellt werden und die neuen Objekts wird seine interne
[[Prototype]]
initialisiert mit diesemprototype
Eigenschaft. Zum Beispiel,Eigentliche problem
Nun lassen Sie uns zurück zu der eigentlichen Frage. Nehmen wir den ersten Fall
Holt
Function.prototype
ersten mal und es wird versuchen, und finden, wenn dieses Objekt in der Prototyp-Hierarchie vonObject
. Lassen Sie uns sehen, was das wirdDa die
Function.prototype
entspricht derObject
's interne Eigenschaft[[Prototype]]
es gibttrue
.Nun nehmen wir den zweiten Fall
Hier, ersten, erhalten wir die
Object.prototype
, die{}
. Nun, es versucht zu finden, wenn das gleiche Objekt{}
ist es in derFunction
's Prototyp-Kette. Unmittelbare übergeordneteFunction
ist und die Leere Funktion.Es ist nicht das gleiche wie
Object.prototype
Aber die
[[HasInstance]]
Algorithmus Stoppt nicht dort. Es wiederholt sich und bekommt eine weitere Ebene,- Und das ist das gleiche wie
Object.prototype
. Das ist, warum diese zurücktrue
.InformationsquelleAutor thefourtheye
Vom MDN:
Im wesentlichen, es wird geprüft, ob
Object
(nicht eine Instanz vonObject
, aber der Konstruktor selbst) hat als eine Instanz vonFunction.constructor
irgendwo seine Prototyp-Kette.Und in der Tat:
Dies erklärt, warum
Object instanceof Function
sowie der Rückseite.InformationsquelleAutor Andrew Eisenberg
ALLE Objekte haben eine interne Eigenschaft [[Prototype]]. Der Wert dieser Eigenschaft entweder null oder ein Objekt und ist für die Umsetzung der Vererbung. Wenn Sie versuchen, zu suchen, bis Sie eine Taste auf ein Objekt und es wird nicht gefunden, JavaScript Aussehen wird, für die es in der Prototyp-Kette.
Den Function-Konstruktor erzeugt neue Funktion Objekte (Instanzen der Function-Konstruktor). Die prototype-Eigenschaft ist spezifisch für die Funktion von Objekten. Die Konstruktor-Funktion ist selbst eine Funktion-Objekt (Instanz von Function-Konstruktor).
Wenn ein Function-Objekt wird verwendet, wie ein Konstruktor, der ein neues Objekt erstellt werden und das neue Objekt wird seinem [[Prototype]] initialisiert mit der prototype-Eigenschaft des Konstruktors.
Die Sprache Skillung ist, dass alle Objekte Instanzen von Object-Konstruktor, und alle Funktionen sind Instanzen der Function-Konstruktor.
Objekt instanceof-Funktion ist wahr,, weil Objekt ist eine Funktion und ist somit eine Instanz der Funktion (Objekt ist ein Function-Objekt - eine Instanz der Function-Konstruktor). Objekt erbt von der Funktion.der Prototyp.
Objekt instanceof Objekt ist wahr, weil die Objekt erbt von der Funktion.der Prototyp. Da Die Funktion.Prototyp ist ein Objekt,, erbt von Object.der Prototyp.
Function-Instanz des Objekts true ist, weil die Funktion erbt von der Funktion.der Prototyp. Da Die Funktion.Prototyp ist ein Objekt,, erbt von Object.der Prototyp.
Die Prototyp-Kette sieht wie folgt aus:
Funktion instanceof-Funktion ist wahr,. Funktion wird eine Instanz von sich selbst (natürlich, da es eine Funktion ist, und damit eine Instanz-Funktion). Die Prototyp-Kette sieht wie folgt aus:
So beachten Sie, dass die Funktion() und Object () - Konstruktoren sind Funktionen. Denn Sie sind Funktionen, die Instanzen der Function () - Konstruktor und Vererbung aus-Funktion.der Prototyp.
Da Die Funktion.Prototyp ist ein Objekt, Funktion.Prototyp ist eine Instanz von Object, so Erben von Object.der Prototyp.
InformationsquelleAutor misterd89
Ist die Quelle der Verwirrung, die in Ihrer Frage liegt in der inhärenten duale Natur von Funktionen* in JavaScript (ECMAScript).
Funktionen in js sind beide Stammgäste Funktionen und Objekte an der gleichen Zeit. Denke, von Ihnen als Algorithmische Dr. Jekyll und Mr. Hyde. Sie sehen aus wie Objekte, die auf der Außenseite, aber innen sind Sie einfach nur Ihren guten alten js-Funktionen mit all Ihren Macken, oder vielleicht ist es die andere Weise herum!
JavaScript ist wirklich eine heikle Sache 🙂
Also zurück zu deiner Frage, die Kreditaufnahme, die syntax, die auf MDN:
object instanceof constructor
Anwendung auf die erste Anweisung im code:
Object instanceof Function
Hier haben Sie
Object
eine Konstruktor-Funktion, die verwendet wird, als Objekt-Initialisierer, aber da Funktionen führen ein Doppel-Leben in js, es hat Objekt-spezifische Requisiten und Methoden angefügt rendering it effektiv ein Objekt zu.So, die erste Bedingung in die Anweisung wurde erfüllt. Wir bleiben zu untersuchen, der andere Zustand oder die Operanden.
Function
wie Sie vielleicht bemerkt haben, ist auch die Funktion, Konstruktor, aber seine anderen Objekt Seite kein Interesse an uns, jetzt, während der Ausführung dieser bestimmten Anweisung.So, die syntaktischen Bedingungen sind beide erfüllt, nämlich "Objekt" und "constructor". Können wir jetzt dann gehen, um Ihren zu untersuchen erbliche Beziehung und wenn es eine Verbindung zwischen Ihnen.
Seit
Object
ist eine funktionierende Funktion selbst, es macht sehr viel Sinn anzunehmen, dass es seinen internen Prototyp-prop zeigen auf derFunction.prototype
Objekt Referenz da in js ALLE Funktionen Erben Ihre Requisiten und Methoden, durch OrtFunction.prototype
.true
ist definitiv die NUR erwartete Ergebnis dieses Vergleichs erfolgt durch deninstanceof
Betreiber.Für den anderen Fall:
Function instanceof Object
Da wir etabliert bereits, dass die Funktionen in js auch ein Objekt Seite zu Ihnen. Macht es Sinn, dass Sie Ihre Lust Objekt-spezifische Spielzeug aus der
Object.prototype
, und daher bilden Sie Instanzen des Objekt-Konstruktors.Hoffe, ich habe nicht die Verwirrung mit meiner Erklärung und Allegorien. 🙂
*: Nicht nur Funktionen, die ein Doppelleben führen, in js. Fast alle Daten-Typen in js ein Objekt dunklen Seite, um Ihnen zu ermöglichen, den Abschluss von Operationen und Manipulationen, ohne jede Hektik.
InformationsquelleAutor Mr. X
Den meisten badass-Eigenschaft ist eigentlich, dass die Funktion eine Instanz von sich selbst.
Function instanceof Function
true zurück.Ist es schön erklärt in Kannan ' s Die Überraschend Eleganten Javascript-Type-Modell, bei http://web.archive.org/web/20140205182624/http://vijayan.ca/blog/2012/02/21/javascript-type-model
Zitat Ende die Erklärung:
InformationsquelleAutor Aurélien Ribon
Sehr Einfache Erklärung, die Anders ist als alle Antworten
Beide-Objekt und Funktion sind Konstruktoren(Typ sowohl mit zurück-Funktion "Objekte"), und beide sind erstellt von Function-Konstruktor.
Die __proto__ - Eigenschaft der beiden Punkt-zu ' - Funktion.Prototyp' - Objekt.
KURZE ERKLÄRUNG: __proto__ - Eigenschaft, die ein Objekt(sagen wir p1, welches Person-Typ) verweist auf den Konstruktor Prototyp(sagen wir Person.Prototyp)
Wieder die __proto__ in der Prototyp-Kette Punkte auf dem Objekt "Objekt.Prototyp".
BEVOR Sie nun weiterlesen DRUCKEN DETAILS AUF der CHROME-KONSOLE.dir(Objekt), Konsole.dir(Funktion)
Beachten, function-Konstruktoren und auch Objekte, so dass Sie beide sehen .prototype und __proto__ - Eigenschaften. In die Instanz-Objekte(sagen wir p1) finden Sie nur die __proto__ - Eigenschaft. Die __proto__ ist-accessor für die hidden-Eigenschaft [[Prototye]] und der beste Weg, um zu bekommen, ist Objekt.getPrototypeOf(p1) als __proto__ ist depricated.
(p1 instanceof Person) hier-operator prüft, ob der Konstruktor Person Prototyp ist in der prototypal Kette des Objekts p1. machen Sie sich eine Notiz, dass der erste Wert ist das Instanz-Objekt(p1) und der zweite Wert ist ein Konstruktor (Person).
Können Analyse => Funktion instanceof Object.
Objekt Funktion ist __proto__.__proto__ Punkte zum Objekt.Prototyp , So dass dessen wahre
Können Analyse => Objekt instanceof-Funktion.
Objekt ist __proto__ Punkte, um zu Funktionieren.Prototyp, So dass dessen wahre
Hoffe, das hilft.
InformationsquelleAutor Sumer