如何检查是否一个JavaScript类继承另一个(不创建一个OBJ)?(How to check i

2019-07-18 14:52发布

例如:

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

如何检查,如果B类继承A类?

Answer 1:

试试这个B.prototype instanceof A



Answer 2:

您可以测试直接继承

B.prototype.constructor === A

为了测试间接继承,你可以使用

B.prototype instanceof A

(该第二溶液首先通过涅Tikku给出)



Answer 3:

回2017年:
检查你的工作

A.isPrototypeOf(B)


Answer 4:

陷阱:注意instanceof如果您使用多个执行上下文/窗口不能按预期工作。 见§§ 。


此外,每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.protof.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


Answer 5:

我不认为西蒙意味着B.prototype = new A()在他的问题,因为这肯定不是办法在JavaScript链原型。

假设B扩展A,使用Object.prototype.isPrototypeOf.call(A.prototype, B.prototype)



文章来源: How to check if a Javascript Class inherits another (without creating an obj)?