参考Typescript中的静态类

时间:2014-06-27 01:17:34

标签: typescript

我有以下情况。我希望能够在基类(寄存器)上定义静态方法,该方法使用对其他静态属性的引用,这些属性应该被覆盖。例如:

class Base {
    constructor() { }
    public static name = "Override me please";
    public static register = function() { console.log( Base.name ) }
}

class Child extends Base {
    constructor() { super() }
    public static name = "Child";
}

然后我当然希望Child.register()打印出来的孩子'。是否可以获得当前类的引用?我知道我总是可以传入对类的引用,但这似乎不如直接引用该类更优雅。

任何帮助表示赞赏!谢谢!

2 个答案:

答案 0 :(得分:2)

这是一个实现你做的事情。

class Base {
    constructor() { }
    public static aname = "Override me please";
    public static register = function() { console.log( this.aname ) }
}

class Child extends Base {
    constructor() { super() }
    public static aname = "ChildName";
}

有两点需要注意。

  1. JavaScript this绑定的工作方式。当您致电Child.register()时,this基本上会引用.左侧的内容。在这"静态"上下文,这将引用"构造函数"生成的JavaScript中的函数,即" Class"在TypeScript中。

  2. 因为this引用了一个函数(在JavaScript中),name是函数的标准属性,并且您对该属性的命名可能需要更改(但是,这可能不是根据{{​​3}}),是标准的。您拥有Child.name = "Child"值的事实可能掩盖了这一点。

答案 1 :(得分:0)

您可以使用所有JavaScript函数constructor上可用的prototype属性,因此可以使用实例__proto__

class Base {
    constructor() { }
    public static name = "Override me please";
    public static register = function() { console.log( Base.name ) }
}

class Child extends Base {
    constructor() { 
        super();
        console.log(this.constructor['name']); // use local version
     }
    public static name = "Child";
}

var child = new Child();