2011-12-09 20 views

Odpowiedz

21

Moja odpowiedź będzie krótka ...

Można użyć metody isPrototypeOf, która będzie występować w przypadku, gdy obiekt dziedziczy od prototypu obiektu, jak swoim przykładzie.

przykład:

A.isPrototypeOf(C) // true 
B.isPrototypeOf(C) // true 
Array.prototype.isPrototypeOf(C) // false 

Więcej informacji można przeczytać tutaj: Mozilla Developer Network: isPrototypeOf

+1

+1 Proste rozwiązanie. Chociaż twoje przykłady są całkowicie poprawne, byłoby to 'Array.prototype.isPrototypeOf (C)', aby sprawdzić, czy 'C' jest tablicą (Ostatni twój przykład był trochę niejednoznaczny - użycie' isPrototypeOf' na funkcji zwykle nie jest czego chcesz). – pimvdb

+0

Masz całkowitą rację, nie chciałem stracić zbyt wiele czasu, odkąd odpowiedź została już podana, więc nie myślałem zbyt wiele o przykładach, moim celem było tylko pokazanie dostępnej metody .. nadal będę poprawiał przykład podany z twoją odpowiedzią, ponieważ jak powiedziałeś i zgadzam się, mój ostatni przykład jest niejednoznaczny, dzięki za wypowiedź =) – Couto

+0

Po prostu szybkie pytanie: jak to możliwe, że obiekt nie dziedziczy z Object? Każdy obiekt ma odniesienie [[Prototype]], które poprzez łańcuch prototypów ostatecznie prowadzi do Object.prototype. –

4

Można powtórzyć cykl prototypowy, dzwoniąc pod numer Object.getPrototypeOf: http://jsfiddle.net/Xdze8/.

function isInPrototypeChain(topMost, itemToSearchFor) { 
    var p = topMost; 

    do { 

     if(p === itemToSearchFor) { 
      return true; 
     } 

     p = Object.getPrototypeOf(p); // prototype of current 

    } while(p); // while not null (after last chain) 

    return false; // only get here if the `if` clause was never passed, so not found in chain 
} 
+0

+1 miał pisać niemal identyczną * * odpowiedź, nawet z 'zrób while', które don” t zbyt często. Ale twoja jest przekształcona w funkcję, która jest przyjemniejsza. – RightSaidFred

+0

@RightSaidFred: Zabawne, myślałem także o tym, że używałem słowa kluczowego 'do', którego prawie nigdy nie robię. – pimvdb

+0

Jestem zaskoczony, że nie ma propozycji "Object.hasPrototype" dla ES6, która wykonuje dokładnie to, co robi twoja funkcja. Po prostu wydaje się naturalnym uzupełnieniem 'Object.create' jako' instanceof' jest 'new Constructor'. Może nawet przyjąć funkcję jako drugi argument, który użyłby "prototypu" funkcji jako celu. – RightSaidFred

Powiązane problemy