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

时间:2016-08-01 19:52:23

标签: javascript reflection typescript superclass introspection

我们说我有:

class Foo {}
class Bar extends Foo {}
var clazz = Bar;

我发现要Bar clazz.prototype.constructor {/ 1}}。

如何找出Bar的父类?

3 个答案:

答案 0 :(得分:2)

正如@MattiasBuelens对答案的评论,它应该是:obj.constructor而不是obj.prototype.constructor,因为obj.prototype为空(prototype属性存在于类{{ 1}}但不是实例)。

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

Foo

修改

如果你想用let FooCtor = Object.getPrototypeOf(Object.getPrototypeOf(obj)).constructor; var foo = new FooCtor(); 类而不是实例来做同样的事情,那么:

Bar

答案 1 :(得分:1)

TypeScript 1.8使用它来扩展一个类(为了便于阅读而在这里减少):

var __extends = function (d, b) {
    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
    function __() { this.constructor = d; }
    d.prototype = (__.prototype = b.prototype, new __());
};

var TestPlanetModel = (function (_super) {
    __extends(TestPlanetModel, _super);
    function TestPlanetModel() {
        _super.apply(this, arguments);
    }
    return TestPlanetModel;
}(FrameModel));

使用本地Function来实例化原型,并隐藏该闭包中两个类之间的关系。

感谢Nitzan的诀窍,我只需要检查类,而不是对象,所以我实例化它以获得原型:

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

我没有在没有实例化的情况下弄清楚如何做到这一点。

答案 2 :(得分:0)

我最近发布了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);
}

这是输出:

$ node main.js
MySuper instantiated with param: 3
superObj.id = 3

您可以找到我的项目here