我有一个基类,如下所示:
public class FilterCityStrategy : IFilterStrategy
{
public List<City> Filter<City>(List<City> filterThisData, string partialCityName)
{
//Fails to compile cityName not member of f
return filterThisData.Where(f => f.CityName.StartsWith(partialCityName));
}
}
一个看起来像的子类:
class Speaker {
sayHi() {
if (this.isLoud) {
console.log('HI');
} else {
console.log('hi');
}
}
}
...最后一行是尝试在ES6中创建一个类变量。问题是当我实例化class LoudSpeaker extends Speaker {
}
LoudSpeaker.isLoud = true;
并调用LoudSpeaker
时,sayHi
变量未定义。无论如何从父类访问子类的类变量?
答案 0 :(得分:4)
this.isLoud
与LoudSpeaker.isLoad
不同。第一个引用实例变量,第二个引用LoudSpeaker构造函数的属性,其他语言称之为类变量或静态属性。在Javascript中,您不使用this.isLoud
引用类变量。
要覆盖子类中实例变量isLoud
的值,您可以在构造函数中设置其值。
class Speaker {
constructor() {
this.isLoud = false; // set default value
}
sayHi() {
if (this.isLoud) {
console.log('HI');
} else {
console.log('hi');
}
}
}
class LoudSpeaker extends Speaker {
constructor() {
super();
this.isLoud = true; // override to set our own value
}
}
如果你真的希望isLoud
属性是一个类设置一次但永远不会再设置的东西,那么你可以在原型上设置它然后你可以用this.isLoud
从内部引用它一个实例:
class Speaker {
sayHi() {
if (this.isLoud) {
console.log('HI');
} else {
console.log('hi');
}
}
}
Speak.prototype.isLoud = false; // set default value
class LoudSpeaker extends Speaker {
}
LoudSpeaker.prototype.isLoud = true; // override for this class
这通常不是在Javascript中完成的,因为如果你设置this.isLoud = whatever
,那么它会设置一个&#34;拥有&#34;属性和属性成为特定于该实例的实例属性,这可能真的令人困惑并导致错误。所以,这通常没有完成。但是,如果您初始化原型上的值,则永远不要在实例上设置它,这样您只能用x = this.isLoud
读取它的值,然后它的行为就像可以通过this
访问的类变量一样。 / p>
ES6 wiki中讨论了这个主题。有关详细信息,请参阅ES6 class variable alternatives,因为此功能有意遗漏在ES6类语法之外,这就是为什么它在此处实现为构造函数中设置的常规实例变量或直接在原型上设置的属性(和不是通过类语法)。