如何检查Javascript类是否继承了另一个(没有创建obj)?

时间:2013-01-23 17:49:48

标签: javascript class inheritance

例如:

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

如何检查B类是否继承A类?

5 个答案:

答案 0 :(得分:106)

尝试B.prototype instanceof A

答案 1 :(得分:23)

您可以使用

测试直接继承
B.prototype.constructor === A

要测试间接继承,可以使用

B.prototype instanceof A

(第二个解决方案首先由Nirvana Tikku提供)

答案 2 :(得分:15)

回到2017年:
检查你的工作是否适合

A.isPrototypeOf(B)

答案 3 :(得分:1)

陷阱:请注意,如果您使用多个执行上下文/窗口,则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.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会在检查中与原型proto交换,然后是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

答案 4 :(得分:1)

我不认为Simon在他的问题中的意思是B.prototype = new A(),因为这肯定不是在JavaScript中链接原型的方法。

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