如何测试B是否是Javascript/Node中A的"子类"?

con*_*com 26 javascript node.js

鉴于两个类如下:

function A(name) {
    this.name = name;
}

A.prototype.sayName = function() {
    console.log(this.name);
}

var B = require('some-class');

// B is subclass of A?
Run Code Online (Sandbox Code Playgroud)

有没有办法以编程方式确定B是否是A的子类?

编辑:在我的情况下,B是一个功能并B.prototype扩展A.prototype.B不是回归new A().B instanceof A似乎不起作用.

tom*_*tom 52

检查是否B是子类A(不包括案例B === A):

B.prototype instanceof A
Run Code Online (Sandbox Code Playgroud)

要检查是否BA(的具体情况B === A)的子类:

B.prototype instanceof A || B === A
new B() instanceof A // shorter, but creates an instance of B
Run Code Online (Sandbox Code Playgroud)

  • 在我看来,在通用设置中实例化 `B` 从来都不是正确的做法。你不知道它期望什么参数,它可能有什么副作用,或者 B 是否应该被实例化(它可能打算作为一个抽象类)。不是`B.prototype instanceof A || B === A`够了吗? (3认同)
  • `new` 不是反模式。许多业内顶级开发人员一直在使用它。 (2认同)
  • @ffxsam 你误解了 - 使用`Object.create(proto)` 是一种创建一个新对象的方法,它的原型是指定类型的,但它实际上并不调用构造函数。当您要做的只是检查作为反模式的原型链时,它会调用构造函数并创建一个实例。 (2认同)