2013-08-20 11 views
24

Załóżmy, że mamy następujące:JavaScript isPrototypeOf vs użytkowania instanceof

function Super() { 
     // init code 
} 

function Sub() { 
     Super.call(this); 
     // other init code 
} 

Sub.prototype = new Super(); 

var sub = new Sub(); 

Następnie, w innej części naszego ocde, możemy zastosować jedną z następujących czynności, aby sprawdzić, relacji:

sub instanceof Super; 

lub

Super.prototype.isPrototypeOf(sub) 

Tak czy inaczej, musimy mieć zarówno obiekt (sub) i konstruktora nadrzędnego (Super). Czy istnieje jakikolwiek powód, dla którego używałbyś jednego z drugim? Czy jest jakaś inna sytuacja, w której rozróżnienie jest bardziej jasne?

Przeczytałem już uważnie 2464426, ale nie znalazłem wystarczająco dokładnej odpowiedzi.

+0

możliwe duplikat [? Dlaczego potrzebujemy isPrototypeOf w ogóle] (http://stackoverflow.com/questions/5972991/why-do - potrzebujemy-isprototypof-at-all) – plalx

+0

Na podstawie komentarza PO, powiedziałbym, że to pytanie jest bliższe "Dlaczego w ogóle potrzebujemy' instanceof'? " ale zgadzam się, że prawdopodobnie jest wystarczająco blisko. – apsillers

Odpowiedz

27

Wyobraź sobie, że nie używaj w kodzie konstruktorów, ale zamiast tego używaj Object.create do generowania obiektów z określonym prototypem. Program może być architected używać żadnych konstruktorów w ogóle:

var superProto = { 
    // some super properties 
} 

var subProto = Object.create(superProto); 
subProto.someProp = 5; 

var sub = Object.create(subProto); 

console.log(superProto.isPrototypeOf(sub)); // true 
console.log(sub instanceof superProto);  // TypeError 

Tutaj nie ma funkcji konstruktora do korzystania z instanceof. Możesz użyć tylko subProto.isPrototypeOf(sub).

+1

Dziękuję za odpowiedź i mam jedną szybką odpowiedź: Dlaczego potrzebujemy instanceof, skoro isPrototypeOf wydaje się działać we wszystkich przypadkach? Czy to jest historyczne, czy też istnieją zalety wydajnościowe, czy coś innego? – user1689498

+0

@ user1689498 Po prostu dlatego, że 'isPrototypeOf' został zaimplementowany później. – plalx

+2

@ user1689498: "instanceof" jest starszy, jak sądzę, i wygląda podobnie do Javy, co było wielką sprawą po pierwszym wprowadzeniu JavaScript. Jest również trochę czystszy. Ale tak, 'jestPrototypeOf' jest bardziej ogólnie przydatny. –

7

Nie ma to większego znaczenia, gdy korzystasz z funkcji konstruktora. instanceof jest prawdopodobnie trochę czystszy. Ale jeśli nie ...:

var human = {mortal: true} 
var socrates = Object.create(human); 
human.isPrototypeOf(socrates); //=> true 
socrates instanceof human; //=> ERROR! 

Więc isPrototypeOf jest bardziej ogólne.

+1

Świetnie! :) Ale jedno. "Człowiek" w tym przykładzie powinien być "człowiekiem". Mam na myśli, że powinna to być klasa (Wszyscy ludzie), a nie jedna instancja (człowiek). –

+0

@NaeelMaqsudov: Uważaj na analogie między językami. JavaScript nie ma klas. Nawet jeśli w ES6 dodano trawestację "syntaktycznego" klasy "klasa", język nadal nie będzie miał czegoś podobnego, powiedzmy, klas Java. Dziedziczenie prototypowe ma pewne podobieństwa z klasycznym dziedziczeniem, ale analogie są szorstkie. W każdy sposób dziedziczenia będzie taki obiekt - być może prototyp funkcji konstruktora. Ale uwaga: 'var naeel = Object.create (człowiek); naeel instanceof człowieka; // => true'. Usuwa część cukru z funkcji konstruktora. –

+0

Niestety, błąd nieprawidłowego wycinania i wklejania. 'naeel instanceof człowieka; // => BŁĄD. "Ale' ludzki.prototypOf (naeel); // => true'. –

0
var neuesArray = Object.create(Array); 

Array.isPrototypeOf(neuesArray);   // true 
neuesArray instanceof Array     // false 
neuesArray instanceof Object    // true 
Array.isArray(neuesArray);     // false 
Array.prototype.isPrototypeOf(neuesArray); // false 
Object.prototype.isPrototypeOf(neuesArray); // true 

Czy rozumiesz mojego przyjaciela :) - jest prosta

+0

Nie jestem pewien, co próbujesz przekazać i jak to ma związek z problemem. Czy możesz dodać wyjaśnienie do tego? – Unihedron

+0

Różnica między "instanceof" - Operator i Object.isPrototypeOf() - methode - lub? – svenskanda