如何知道类构造函数是否通过super调用?

Rik*_*ard 6 javascript ecmascript-6

如果我有这个:

class Human {
    constructor(){

    }
}

class Person extends Human {
    constructor(){
        super();
    }
}
Run Code Online (Sandbox Code Playgroud)

是否有可能知道人类的构造函数是否是通过Person类调用的?我想过arguments.callee但是已经弃用了.

Aln*_*tak 6

检查实例是否属于特定子类很容易(但不明智):

class Human {
    constructor(){
        console.log(this instanceof Person);
    }
}
Run Code Online (Sandbox Code Playgroud)

要检查它是否是基类的实例(而不是子类),您可以使用:

Object.getPrototypeOf(this) === Human.prototype
Run Code Online (Sandbox Code Playgroud)

[只要你没有弄乱类并覆盖prototype对象]

您还可以检查this.constructor.name- 它的值将反映所调用的初始构造函数的类型,并且在调用基类构造函数时不会更改,但如果代码缩小,则可能会失败.

  • 这只是BAD面向对象的设计,永远不应该被推荐.超类应该永远不必了解特定的子类.如果你认为它,那么设计需要修复/重新设计,但事实并非如此.总有一种方法可以在没有超类知道子类的情况下进行适当的设计.您可能需要创建子类重写的虚方法,但不应使用任何特定的子类知识对超类进行编码. (3认同)