Как проверить, наследует ли класс Javascript другой (без создания obj)?


например:

function A(){}
function B(){}
B.prototype = new A();

Как я могу проверить, наследует ли класс B класс A?

4 55

4 ответа:

попробовать B.prototype instanceof A

Вы можете проверить прямое наследование с

B.prototype.constructor === A

для проверки косвенного наследования можно использовать

B.prototype instanceof A

(это второе решение было впервые дано Нирваной Тикку)

в 2017-й:
проверить, если это работает для вас

A.isPrototypeOf(B)

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