繁体   English   中英

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

[英]TypeScript / JavaScript - How to get superclass of a class?

假设我有:

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

我发现要让Barclazz.prototype.constructor

如何找出Bar的父类是什么?

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

至于获取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使用它来扩展一个类(为了便于阅读,这里减少了):

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));

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

感谢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);
}

这是输出:

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

你可以在这里找到我的项目。

可以使用“Object.getPrototypeOf(AnyClass)”返回AnyClass的超类:

 class Foo {}
 class Bar extends Foo {};

 let SuperClassOfBar = Object.getPrototypeOf (Bar);
 if (SuperClassOfBar === Foo)
 { console.log 
    (`Superclass of Bar is Foo`);  // yes it is
 }
 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM