TypeScript/JavaScript-如何获取类的超类?

TypeScript/JavaScript-如何获取类的超类?,javascript,reflection,typescript,superclass,introspection,Javascript,Reflection,Typescript,Superclass,Introspection,假设我有: class Foo {} class Bar extends Foo {} var clazz = Bar; 我发现要获得Bar,有clazz.prototype.constructor 如何找出Bar的父类是什么 正如@MattiasBuelens对答案的评论,它应该是:obj.constructor而不是obj.prototype.constructorAsobj.prototype为空(类Bar上存在prototype属性,但实例不存在) 至于获取Foo的构造函数,这是一个丑

假设我有:

class Foo {}
class Bar extends Foo {}
var clazz = Bar;
我发现要获得
Bar
,有
clazz.prototype.constructor


如何找出
Bar
的父类是什么

正如@MattiasBuelens对答案的评论,它应该是:
obj.constructor
而不是
obj.prototype.constructor
As
obj.prototype
为空(类
Bar
上存在
prototype属性,但实例不存在)

至于获取
Foo
的构造函数,这是一个丑陋的黑客:

let FooCtor = Object.getPrototypeOf(Object.getPrototypeOf(obj)).constructor;
var foo = new FooCtor();

编辑 如果要执行相同的操作,但要使用
Bar
类而不是它的实例,则:

let FooCtor = Object.getPrototypeOf(Bar.prototype).constructor;
var foo = new FooCtor();

TypeScript 1.8使用它来扩展一个类(此处为了可读性而减少):

它使用local
函数
实例化原型,并隐藏闭包中两个类之间的关系

多亏了Nitzan的技巧,我只需要检查类,而不是对象,所以我实例化它以获得原型:

var clazz = TestPlanetModel;
var parent = Object.getPrototypeOf(Object.getPrototypeOf(new clazz())).constructor;
alert(parent === FrameModel);

我不知道如何在没有实例化的情况下实现它。

我最近发布了一个增强版的TypeScript编译器,它可以让您在编码时和运行时了解类和接口的所有反射元数据。以下代码适合您的需要:

class MySuper {
    id: number;
    constructor(n: number) {
        console.log("MySuper instantiated with param: " + n);
        this.id = n;
    }
}

class MySub extends MySuper {
    name: string;
}


let sub: Class = MySub.getClass();
if(sub.extends) {
    let superCtor = sub.extends.getConstructor<MySuper>(); //type param is optional, you can get "any" by default.
    //let's instantiate it!!!
    let superObj = new superCtor(3);
    console.log("superObj.id = " + superObj.id);
}

你可以找到我的项目。

我想你的意思是
obj.constructor===Bar
,因为
obj.prototype===undefined
没错。我把问题改为关注类。不,如果你不添加
构造函数
部分,只做以下操作:
Object.getPrototypeOf(Object.getPrototypeOf(obj))
那么它会给你一个
对象
,但是添加
构造函数
,你就会得到
Foo
。只要照着我做的做就行了。我不知道你为什么贴这个答案。你对我的回答没有任何补充。如果您想询问如何在不实例化的情况下执行此操作,那么您可以对我的问题发表评论或编辑您的问题。我做了:)检查问题否,您可以在回答中提供更多详细信息,而不是在问题中。基本上,您采用了我的解决方案,将其作为您自己的答案发布,然后在该答案中询问如何使用类而不是实例来实现它。如果你只是在对我的回答的评论中问这个问题,那么我会回答它,但是在你将我的解决方案发布为你自己的答案之后,我现在有什么动机来回答它呢?我已经更新了这个问题,而你没有回答。所以我想出了答案。更新你的答案,我可以接受。对不起,如果你觉得这有什么害处。这不仅仅是为了接受答案,也是为了不让未来的读者重复答案。在任何情况下,我都会更新我的答案,告诉我如何使用类而不是实例来完成它。
class MySuper {
    id: number;
    constructor(n: number) {
        console.log("MySuper instantiated with param: " + n);
        this.id = n;
    }
}

class MySub extends MySuper {
    name: string;
}


let sub: Class = MySub.getClass();
if(sub.extends) {
    let superCtor = sub.extends.getConstructor<MySuper>(); //type param is optional, you can get "any" by default.
    //let's instantiate it!!!
    let superObj = new superCtor(3);
    console.log("superObj.id = " + superObj.id);
}
$ node main.js
MySuper instantiated with param: 3
superObj.id = 3