NpJak sprawdzić, czy klasa JavaScript dziedziczy inną (bez tworzenia obiektu)?
function A(){}
function B(){}
B.prototype = new A();
Jak mogę sprawdzić, czy klasa B dziedziczy klasy A?
NpJak sprawdzić, czy klasa JavaScript dziedziczy inną (bez tworzenia obiektu)?
function A(){}
function B(){}
B.prototype = new A();
Jak mogę sprawdzić, czy klasa B dziedziczy klasy A?
dać to spróbuj B.prototype instanceof A
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)
nr który będzie sprawdzał tylko klasa rodziców, nie cała herita łańcuch ge. – Simon
Właśnie go przywróciłem. Dzięki Dystroy (również za aktualizację tej odpowiedzi) –
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;
}
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
Zobacz również https://stackoverflow.com/a/29543030/632951 i https://stackoverflow.com/q/30993434/632951 – Pacerier
z powrotem do 2017:
sprawdzić, czy to praca dla ciebie
A.isPrototypeOf(B)
Co z ** ES6 ** 'class'? 'klasa A rozszerza B {}' to jak mogę sprawdzić spadki klasy 'A' – Omid
@ 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