Как проверить, наследует ли класс Javascript другой (без создания obj)?
например:
function A(){}
function B(){}
B.prototype = new A();
Как я могу проверить, наследует ли класс B класс A?
4 ответа:
Вы можете проверить прямое наследование с
B.prototype.constructor === A
для проверки косвенного наследования можно использовать
B.prototype instanceof A
(это второе решение было впервые дано Нирваной Тикку)
Gotchas: отметим, что
instanceof
не работает должным образом, если вы используете несколько контекстов выполнения/windows. Смотрите §§.
кроме того, за 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
если это не равно, прото заменяется на прото прото в чеке, затем прото прото прото и так далее. Таким образом:
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