Например:
function A(){}
function B(){}
B.prototype = new A();
Как я могу проверить, наследует ли класс B класс A?
Например:
function A(){}
function B(){}
B.prototype = new A();
Как я могу проверить, наследует ли класс B класс A?
попробуйте B.prototype instanceof A
Вы можете проверить прямое наследование с помощью
B.prototype.constructor === A
Чтобы проверить косвенное наследование, вы можете использовать
B.prototype instanceof A
(это второе решение было впервые дано Нирваной Тикку)
Gotchas: Обратите внимание, что instanceof
не работает должным образом, если вы используете несколько контекстов/окон выполнения. См. & sect; & sect;.
Также, за https://johnresig.com/blog/objectgetprototypeof/, это альтернативная реализация, которая идентична instanceof
:
function f(_, C) { // instanceof Polyfill
while (_ != null) {
if (_ == C.prototype)
return true;
_ = _.__proto__;
}
return false;
}
Изменив его, чтобы проверить класс, мы получаем:
function f(ChildClass, ParentClass) {
_ = ChildClass.prototype;
while (_ != null) {
if (_ == C.prototype)
return true;
_ = _.__proto__;
}
return false;
}
instanceof
сам проверяет, есть ли obj.proto
f.prototype
, таким образом:
function A(){};
A.prototype = Array.prototype;
[]instanceof Array // true
и
function A(){}
_ = new A();
// then change prototype:
A.prototype = [];
/*false:*/ _ instanceof A
// then change back:
A.prototype = _.__proto__
_ instanceof A //true
и
function A(){}; function B(){};
B.prototype=Object.prototype;
/*true:*/ new A()instanceof B
Если он не равен, proto заменяется прото прото в чеке, затем прото прото прото и т.д. Таким образом:
function A(){}; _ = new A()
_.__proto__.__proto__ = Array.prototype
g instanceof Array //true
и
function A(){}
A.prototype.__proto__ = Array.prototype
g instanceof Array //true
и
f=()=>{};
f.prototype=Element.prototype
document.documentElement instanceof f //true
document.documentElement.__proto__.__proto__=[];
document.documentElement instanceof f //false
вернуться к 2017 году:
проверьте, работает ли это для вас
A.isPrototypeOf(B)