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

如何检查一个Javascript类是否继承了另一个类(不创建obj)?,javascript,class,inheritance,Javascript,Class,Inheritance,例如: 如何检查类B是否继承类A?您可以使用测试直接继承 B.prototype.constructor==A 要测试间接继承,可以使用: B.A的原型实例 (Nirvana Tikku首先给出了第二种解决方案)尝试以下方法: 父类的ChildClass.prototype实例 Gotchas:请注意,如果使用多个执行上下文/窗口,则的instanceof不会按预期工作。看 此外,根据,这是一个与instanceof相同的替代实现: function A(){} function B(){

例如:


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

您可以使用测试直接继承

B.prototype.constructor==A
要测试间接继承,可以使用:

B.A的原型实例
(Nirvana Tikku首先给出了第二种解决方案)

尝试以下方法:

父类的ChildClass.prototype实例
Gotchas:请注意,如果使用多个执行上下文/窗口,则
的instanceof
不会按预期工作。看


此外,根据,这是一个与
instanceof
相同的替代实现:

function A(){}
function B(){}
B.prototype = new A();
将其修改为直接检查类,将为我们提供:

function f(_, C) { // instanceof Polyfill
  while (_ != null) {
    if (_ == C.prototype)
      return true;
    _ = _.__proto__;
  }
  return false;
}

旁注

instanceof
本身检查
obj.proto
是否为
f.prototype
,因此:

function f(ChildClass, ParentClass) {
  _ = ChildClass.prototype;
  while (_ != null) {
    if (_ == C.prototype)
      return true;
    _ = _.__proto__;
  }
  return false;
}
以及:

以及:

如果它不相等,则proto与检查中proto的proto交换,然后proto的proto与proto的proto交换,依此类推。因此:

function A(){}; function B(){};
B.prototype=Object.prototype;
/*true:*/ new A()instanceof B 
以及:

以及:

回到2017年:
看看这对你有用吗

ParentClass.isPrototypeOf(ChildClass)

我认为Simon在他的问题中不是指
B.prototype=newa()
,因为这肯定不是用JavaScript链接原型的方法


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

否,这将只检查父类,而不是所有的遗产链。只是恢复了它。感谢dystroy(也更新了这个答案)也看到了,在修改后的代码片段中有了“C.prototype”,虽然您已经用“ParentClass”替换了“C”参数,但是ES6
class
class A扩展了B{}
,那么我如何检查class
A
@Omid ES6类的继承语法主要是:一些特殊语法。在幕后,“类”的实际处理没有改变,因此您仍然可以使用
A.prototype
。。。工作完美,但林特抱怨。似乎如果程序不能完全控制父类,那么父类就有伪造答案的风险。它扩展到所有原型函数。如果程序对父类有完全的控制,那么应该没有问题。它怎么能伪造答案呢?通过使用符号?如果发生这种情况,他们为什么要这样做呢?可能是通过设计实现的“此外,对象的属性可能会影响Object.prototype上的内置项,从而可能导致意外行为或拒绝服务安全漏洞。”例如,Web服务器解析来自客户端的JSON输入并直接在结果对象上调用hasOwnProperty是不安全的,因为恶意客户端可能发送类似{“hasOwnProperty”:1}的JSON值并导致服务器崩溃。为了避免这种微妙的错误,最好总是从Object.prototype调用这些方法。例如,foo.hasOwnProperty(“bar”)应该替换为Object.prototype.hasOwnProperty.call(foo,“bar”)。“--我不同意必须始终替换它。只有在这种情况下,程序员无法控制可能的父类值的范围时才有必要。
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