我有一个超类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
有办法吗?或者我只是使用完全错误的模式?
答案 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>
。