operatorinstanceof pozwala sprawdzić, czy obiekt należy do określonej klasy. Uwzględnia również dziedziczenie.
w wielu przypadkach taka kontrola może być konieczna. Na przykład, może być użyty do budowy funkcji polimorficznej, która traktuje argumenty różnie w zależności od ich typu.,
Operator instanceof
składnia jest następująca:
obj instanceof Class
zwraca truejeśli objnależy do Class lub klasy dziedziczącej z niej.,
na przykład:
// instead of classfunction Rabbit() {}alert( new Rabbit() instanceof Rabbit ); // true
a także odnosi się do Object z klasą., To dlatego, że Array prototypowo dziedziczy z Object.
Zwykleinstanceof sprawdza łańcuch prototypów do sprawdzenia. Możemy również ustawić niestandardową logikę w metodzie statycznej Symbol.hasInstance.,
algorytm obj instanceof Class działa mniej więcej w następujący sposób:
oto ilustracja tego, co rabbit instanceof Animal porównuje się z Animal.prototype:
przy okazji istnieje również metoda obja.isprototypeof (objB), który zwraca true jeśli objA znajduje się gdzieś w łańcuchu prototypów objB., Tak więc test obj instanceof Classmożna przeformułować jako Class.prototype.isPrototypeOf(obj).
To zabawne, ale sam konstruktorClass nie bierze udziału w sprawdzaniu! Liczy się tylko łańcuch prototypów i Class.prototype.
może to prowadzić do interesujących konsekwencji, gdy właściwośćprototype jest zmieniana po utworzeniu obiektu.
Jak tutaj:
Bonus: obiekt.prototyp.,toString dla typu
wiemy już, że zwykłe obiekty są konwertowane na ciąg znaków jako :
let obj = {};alert(obj); // alert(obj.toString()); // the same
div>
to ich implementacja toString. Ale jest ukryta funkcja, która sprawia, że toString jest znacznie potężniejsza. Możemy go użyć jako rozszerzonego typeof I alternatywy dla instanceof.
brzmi dziwnie? W rzeczy samej. Demystify.,
według specyfikacji wbudowany toString może być wyodrębniony z obiektu i wykonywany w kontekście dowolnej innej wartości. I jego wynik zależy od tej wartości.
zademonstrujmy:
tutaj użyliśmy wywołania, jak opisano w rozdziale dekoratory i przekazywanie, call/apply do wykonania funkcji objectToStringw kontekście this=arr.
wewnętrznie algorytmtoString bada this I zwraca odpowiedni wynik. Więcej przykładów:
Symbol.,tostringtag
zachowanie obiektutoString można dostosować za pomocą specjalnej właściwości obiektuSymbol.toStringTag.
na przykład:
let user = { : "User"};alert( {}.toString.call(user) ); //
dla większości obiektów specyficznych dla środowiska istnieje taka właściwość. Oto kilka przykładów specyficznych dla przeglądarki:
jak widać, wynik jest dokładnie Symbol.toStringTag(jeśli istnieje), zawinięty w.,
na końcu mamy „typeof na sterydach”, który działa nie tylko dla prymitywnych typów danych, ale także dla wbudowanych obiektów, a nawet może być dostosowywany.
możemy użyć{}.toString.call zamiastinstanceof dla obiektów wbudowanych, gdy chcemy uzyskać Typ jako ciąg znaków, a nie tylko sprawdzać.,4012″>
works for
returns
typeof
primitives
string
{}.toString
primitives, built-in objects, objects with Symbol.toStringTag
string
instanceof
objects
true/false
As we can see, {}.toString is technically a „more advanced” typeof.,
iinstanceof operator naprawdę świeci, gdy pracujemy z hierarchią klas i chcemy sprawdzić klasę z uwzględnieniem dziedziczenia.
Dodaj komentarz