Was ist das?
Javascript ist eine prototypische Sprache, was bedeutet, dass sie Prototypen für die "Vererbung" verwendet. die instanceof
Operator prüft, ob eine Konstruktorfunktion die prototype
propertype ist in der __proto__
Kette eines Objekts. Das bedeutet, dass es Folgendes tut (unter der Annahme, dass testObj ein Funktionsobjekt ist):
obj instanceof testObj;
- Prüfen, ob der Prototyp des Objekts mit dem Prototyp des Konstruktors übereinstimmt:
obj.__proto__ === testObj.prototype
>> wenn dies ein true
instanceof
wird zurückgegeben true
.
- Wird in der Prototypenkette aufsteigen. Zum Beispiel:
obj.__proto__.__proto__ === testObj.prototype
>> wenn dies ein true
instanceof
wird zurückgegeben true
.
- Schritt 2 wird so lange wiederholt, bis der gesamte Prototyp des Objekts inspiziert ist. Wenn nirgendwo in der Prototypenkette des Objekts eine Übereinstimmung mit
testObj.prototype
dann instanceof
Operator wird zurückgeben false
.
Exemple :
function Person(name) {
this.name = name;
}
var me = new Person('Willem');
console.log(me instanceof Person); // true
// because: me.__proto__ === Person.prototype // evaluates true
console.log(me instanceof Object); // true
// because: me.__proto__.__proto__ === Object.prototype // evaluates true
console.log(me instanceof Array); // false
// because: Array is nowhere on the prototype chain
Welche Probleme werden damit gelöst?
Es löste das Problem der bequemen Überprüfung, ob ein Objekt von einem bestimmten Prototyp abgeleitet ist. Zum Beispiel, wenn eine Funktion ein Objekt empfängt, das verschiedene Prototypen haben kann. Dann können wir, bevor wir Methoden aus der Prototypenkette verwenden, die instanceof
Operator, um zu prüfen, ob diese Methoden auf dem Objekt vorhanden sind.
Exemple :
function Person1 (name) {
this.name = name;
}
function Person2 (name) {
this.name = name;
}
Person1.prototype.talkP1 = function () {
console.log('Person 1 talking');
}
Person2.prototype.talkP2 = function () {
console.log('Person 2 talking');
}
function talk (person) {
if (person instanceof Person1) {
person.talkP1();
}
if (person instanceof Person2) {
person.talkP2();
}
}
const pers1 = new Person1 ('p1');
const pers2 = new Person2 ('p2');
talk(pers1);
talk(pers2);
Hier im talk()
Funktion wird zunächst geprüft, ob sich der Prototyp auf dem Objekt befindet. Danach wird die entsprechende Methode zur Ausführung ausgewählt. Wird diese Prüfung nicht durchgeführt, könnte eine Methode ausgeführt werden, die nicht existiert, was zu einem Referenzfehler führt.
Wann ist es angebracht und wann nicht?
Wir haben das bereits besprochen. Verwenden Sie es, wenn Sie den Prototyp eines Objekts überprüfen müssen, bevor Sie etwas mit ihm tun.