90

例如:

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

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

4

5 回答 5

167

尝试以下操作:

ChildClass.prototype instanceof ParentClass
于 2013-01-23T17:52:29.940 回答
39

您可以测试直接继承

B.prototype.constructor === A

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

B.prototype instanceof A

(这第二个解决方案首先由 Nirvana Tikku 给出)

于 2013-01-23T17:50:31.650 回答
27

回到 2017 年:
检查这是否适合你

ParentClass.isPrototypeOf(ChildClass)

如果您想要防止阴影,则可以选择:

const isPrototypeOf = Function.call.bind(Object.prototype.isPrototypeOf);

// Usage:
isPrototypeOf(ParentClass, ChildClass); // true or false
于 2017-08-13T20:14:22.287 回答
2

陷阱:请注意,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 

如果不相等,则在检查中将 proto 与 proto 的 proto 交换,然后将 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
于 2017-08-13T04:06:41.410 回答
1

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

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

于 2018-10-10T16:49:27.523 回答