我可以在实例方法中引用子类的class属性吗?

时间:2014-05-28 16:09:22

标签: typescript

我有一个超类A,它有一个类属性templateUrl 以及一个使用class属性的实例方法f

class A {
    public static templateUrl: string = "default.html";
    public f() {
        console.log(A.templateUrl);
    }
}

有没有办法在self的正文中说A而不是f所以 子类将访问被覆盖的templateUrl?

更具体地说,当我将这个类扩展到一个范围时 具体课程......

class B extends A {
}

class C extends A {
    public static templateUrl: string = "projectX.html";
}

...然后去:

new A().f()
new B().f()
new C().f()

......我会看到这个:

default.html
default.html
default.html

...但想要看到这个:

default.html
default.html
projectX.html

有办法吗?或者我只是使用完全错误的模式?

2 个答案:

答案 0 :(得分:2)

好吧,如果子类的每个实例都希望重新定义templateUrl的值,那么很明显你想要的是实例字段成员不是静态字段会员就像你现在一样。

因此,最简单的解决方案可能是:

class A {

    constructor(public templateUrl="default.html"){
    }

    public f() {
        console.log(this.templateUrl);
    }
}

class B extends A {}

class C extends A {
    constructor(){
        super("projectX.html");
    }
}


new A().f();
new B().f();
new C().f();

产生你想要的东西:

default.html
default.html
projectX.html

<强> - 编辑 -

关于您对字段共享相同值的评论

var url = 'index.html'
var a = new A(url);
var b = new B(url);
var c = new B(url);

Aren他们都拥有相同的价值吗?

答案 1 :(得分:1)

在JavaScript中使用constructor的性质,您可以执行以下操作,以避免需要在对象的每个实例中存储值:

class A {
    public static templateUrl = "default.html";
    public f() {
        /* 
         the static value is stored on the constructor
         for the class, so we can grab it by 
         casting away the specific type and
         accessing the property directly
         */
        return (<any>this).constructor.templateUrl;
    }
}

class B extends A { }

class C extends A {
    public static templateUrl = "projectX.html";    
}

console.log(new A().f()); // <==default.html 
console.log(new B().f()); // <==default.html
console.log(new C().f()); // <==projectX.html

可以通过对象(或constructor上下文)的this属性访问构造函数。从那里,您可以访问存储为static的任何属性。 static属性通过TypeScript编译器发出的代码自动复制到派生类。

强制编译器忽略用于检索属性值的JavaScript语法,必须声明<any>