Grammatik
Objektinstanz des Konstruktors
Parameter
Objekt:
Das zu erkennende Objekt.
Konstruktor:
Ein Konstruktor
beschreiben:
Der Instanzoperator wird verwendet, um festzustellen, ob der Konstruktor.Prototyp in der Prototypkette des Parameterobjekts vorliegt.
// Definieren Sie die Konstruktorfunktion c () {} Funktion d () {} var o = new c (); // true, weil Object.getPrototypeof (o) === C.Prototypeo -Instanz c; // false, weil d.prototype nicht in der Prototyp -Kette von o Instanz von d ist; o Instanz des Objekts; // true, weil object.prototype.isprototypeof (o) truec.prototypeninstanz von Objekt zurückgibt // true, wie oben C.Prototype = {}; var o2 = new C (); O2 Instanz von c; // trueo Instance von c; // false, c.Prototypen verweist auf ein leeres Objekt, das sich nicht auf der Prototyp -Kette von O.D.Prototype = neu C () befindet; // inherit var o3 = neu d (); O3 Instanz d; // trueo3 Instance von c; // WAHREs ist zu beachten, dass, wenn der Ausdruck OBJ Instance von Foo wahr zurückgibt, nicht bedeutet, dass der Ausdruck für immer zurückgeführt wird, da sich der Wert der Foo. -Prototyp -Eigenschaft ändern kann und der veränderte Wert in der OBJ -Prototyp -Kette möglicherweise nicht existiert, und der Wert des ursprünglichen Ausdrucks wird falsch. In einem anderen Fall ändert sich auch der Wert des ursprünglichen Ausdrucks, was der Fall ist, in dem die Prototypkette des Objekts OBJ geändert wird. Obwohl wir in der aktuellen ES-Spezifikation nur den Prototyp des Objekts lesen und nicht ändern können, kann er mit Hilfe des nicht standardmäßigen __proproto__ magischen Attributs erreicht werden. Zum Beispiel wird OBJ Instance of foo nach der Ausführung von obj .__ proto__ = {} false zurückgegeben.
Instanz- und Multi-Global-Objekte (Interaktion zwischen mehreren Rahmen oder mehreren Fenstern)
In einem Browser müssen unsere Skripte möglicherweise zwischen mehreren Fenstern interagieren. Mehrere Fenster bedeuten mehrere globale Umgebungen, und unterschiedliche globale Umgebungen haben unterschiedliche globale Objekte, wodurch unterschiedliche Konstrukteure integriert werden. Dies kann einige Probleme verursachen. Zum Beispiel wird der Ausdruck [] Instanzfenster.
Beispiel
Die allgemeine Verwendung von Instanzen ist zu bestimmen, ob a vom Typ B ist:
console.log (echte Instanz des Booleschen); // false console.log (neue Nummer (1) Instanz der Nummer); // WAHR
Instanz kann auch den übergeordneten Typ bestimmen:
function father () {} function child () {} child.prototype = new father (); var a = new Child (); console.log (ein Instanz von Child); // trueconsole.log (ein Instanz des Vaters); // WAHRDer Kinderkonstruktor erbt vom Vater. Beispiel A ist zweifellos vom Kind konstruiert, aber warum ist es auch eine Instanz des Vaters? Tatsächlich kann der Kern des Instanzoperators einfach mit dem folgenden Code beschrieben werden:
Funktionsprüfung (a, b) {while (a .__ proto__) {if (a .__ proto__ === -Prototypen) return true; a = a .__ proto__; } return false;} Funktion foo () {} console.log (Objektinstanz von Object === check (Objekt, Objekt)); // true console.log (Funktionsinstanzfunktion === check (Funktion, Funktion)); // true console.log (numberinstanz von number === check (number, nummer)); // true console.log (String -InstanceOf string === check (String, String)); // true console.log (Funktionsinstanz von Object === check (Funktion, Objekt)); // true console.log (foo instanceof function === check (foo, function)); // True Console.log (foo Instance von foo === check (foo, foo)); // True Console.log (foo Instance von foo === check (foo, foo)); // True Console.log (foo Instance von foo === check (foo, foo)); // WAHREinfach ausgedrückt, wenn A eine Instanz von B ist, kann A definitiv die im B -Prototyp definierten Methoden und Eigenschaften verwenden. In Code bedeutet dies dann, dass Objekte mit demselben Wert in einer Prototypkette mit B.Prototypen vorhanden sind. Befolgen Sie also einfach einer Prototyp -Kette von A, um Schicht zu suchen.
Es ist auch erwähnenswert, dass die String -Nummer boolean und Funktion Funktionen sind und Funktionen gleichmäßig aus der Funktion konstruiert werden. Sie sind wie jede einfache Funktion und können die Prototyp -Eigenschaften für die Funktion verwenden:
Function.prototype.a = 10; console.log (string.a); // 10
Lassen Sie uns schließlich kurz über die ersten beiden Fragen sprechen.
// Unterscheiden Sie zum Ausdruck des Expression zuerst die linke Expression und die rechte Expression funktionl = Funktion, FunktionR = Funktion; // unten wird nach den Spezifikationen nach unten abgeleitet. // unten wird nach den Spezifikationen nach und nach abgeleitet. __Proto__ l = string.prototype .__ proto__ = null // Das dritte Mal Richter l == null // false zurückgeben