2013-01-23 10 views

Odpowiedz

75

dać to spróbuj B.prototype instanceof A

+2

Co z ** ES6 ** 'class'? 'klasa A rozszerza B {}' to jak mogę sprawdzić spadki klasy 'A' – Omid

+0

@ Omnia ** składnia klasy ES6 ** to głównie: niektóre specjalne _syntax_.Za kulisami faktyczne posługiwanie się "klasami" nie zmieniło się, a zatem nadal możesz pracować z 'A.prototype' ... https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Klasy – cepharum

17

można przetestować bezpośredniego dziedziczenia z

B.prototype.constructor === A 

Aby przetestować dziedziczenie pośrednie, można użyć

B.prototype instanceof A 

(to drugie rozwiązanie po raz pierwszy podane przez Nirvana Tikku)

+5

nr który będzie sprawdzał tylko klasa rodziców, nie cała herita łańcuch ge. – Simon

+0

Właśnie go przywróciłem. Dzięki Dystroy (również za aktualizację tej odpowiedzi) –

1

Gotchas: Pamiętaj, że instanceof nie działa zgodnie z oczekiwaniami, jeśli używasz wielu kontekstów wykonania/okien. Zobacz §§.


Również za https://johnresig.com/blog/objectgetprototypeof/ ta jest alternatywą realizacja, która jest identyczna do instanceof:

function f(_, C) { // instanceof Polyfill 
    while (_ != null) { 
    if (_ == C.prototype) 
     return true; 
    _ = _.__proto__; 
    } 
    return false; 
} 

Modyfikowanie to sprawdzić klasa bezpośrednio daje nam:

function f(ChildClass, ParentClass) { 
    _ = ChildClass.prototype; 
    while (_ != null) { 
    if (_ == C.prototype) 
     return true; 
    _ = _.__proto__; 
    } 
    return false; 
} 


Sidenote

sama instanceof sprawdza czy obj.proto jest f.prototype, a więc:

function A(){}; 
A.prototype = Array.prototype; 
[]instanceof Array // true 

oraz:

function A(){} 
_ = new A(); 
// then change prototype: 
A.prototype = []; 
/*false:*/ _ instanceof A 
// then change back: 
A.prototype = _.__proto__ 
_ instanceof A //true 

oraz:

function A(){}; function B(){}; 
B.prototype=Object.prototype; 
/*true:*/ new A()instanceof B 

Jeśli nie jest równe, proto jest zamienione z proto proto w czek, następnie proto proto of proto, i tak dalej. Zatem:

function A(){}; _ = new A() 
_.__proto__.__proto__ = Array.prototype 
g instanceof Array //true 

oraz:

function A(){} 
A.prototype.__proto__ = Array.prototype 
g instanceof Array //true 

oraz:

f=()=>{}; 
f.prototype=Element.prototype 
document.documentElement instanceof f //true 
document.documentElement.__proto__.__proto__=[]; 
document.documentElement instanceof f //false 
+0

Zobacz również https://stackoverflow.com/a/29543030/632951 i https://stackoverflow.com/q/30993434/632951 – Pacerier

4

z powrotem do 2017:
sprawdzić, czy to praca dla ciebie

A.isPrototypeOf(B) 
Powiązane problemy