问题描述
在Javascript中,类变量和类方法(使用static
关键字定义)很有用。使用它们时,我不想对类的名称进行硬编码,以防万一我重构并更改了类的名称。这就是为什么类方法可以使用this
进入类变量,而实例方法可以使用this.constructor
进入类变量和类方法的原因,如MDN web docs中所述。
但是,它在使用子类时无法正常工作。每个子类都有一个单独的uidCounter
。我希望uid在超类的所有实例(而不是子类)的所有实例中都是唯一的。
class Test {
static uidCounter = 1000;
static uid() {
this.uidCounter += 1;
return this.uidCounter;
}
constructor(tag) {
this.uid = this.constructor.uid();
}
toString() {
return `${this.constructor.name} uid=${this.uid}`;
}
}
class A extends Test {
}
class B extends Test {
}
console.clear();
console.log(new A().toString());
console.log(new A().toString());
console.log(new B().toString());
console.log(new B().toString());
如果我对类的名称进行硬编码,它将按我的预期工作:
class Test {
static uidCounter = 1000;
static uid() {
this.uidCounter += 1;
return this.uidCounter;
}
constructor(tag) {
// class name is hard coded
this.uid = Test.uid();
}
toString() {
return `${this.constructor.name} uid=${this.uid}`;
}
}
class A extends Test {
}
class B extends Test {
}
console.clear();
console.log(new A().toString());
console.log(new A().toString());
console.log(new B().toString());
console.log(new B().toString());
谁可以解释,并且有没有不依赖于对父类名称进行硬编码的解决方案?
回答我自己的问题:
即使未回答该问题,此故障单也已关闭并链接到另一篇文章。我找到了一个解决方案,在这里显示:
class Test {
static top = this;
static uidCounter = 1000;
static uid() {
this.uidCounter += 1;
return this.uidCounter;
}
constructor(tag) {
// instead of hard coding the class name,use an additional class variable
this.uid = this.constructor.top.uid();
}
toString() {
return `${this.constructor.name} uid=${this.uid}`;
}
}
class A extends Test {
}
class B extends Test {
}
console.clear();
console.log(new test().toString());
console.log(new test().toString());
console.log(new A().toString());
console.log(new A().toString());
console.log(new test().toString());
console.log(new test().toString());
console.log(new B().toString());
console.log(new B().toString());
创建另一个用于标识继承层次结构顶部的类变量。这样,我们就可以以无需重构的方式进行重构(例如,更改类的名称)来解决问题。
我想出了另一种解决方案。使用数组(或对象)代替标量。
class Test {
// just use an array
static uidCounter = [1000];
static uid() {
this.uidCounter[0] += 1;
return this.uidCounter;
}
constructor(tag) {
this.uid = this.constructor.uid();
}
toString() {
return `${this.constructor.name} uid=${this.uid}`;
}
}
class A extends Test {
}
class B extends Test {
}
console.clear();
console.log(new test().toString());
console.log(new test().toString());
console.log(new A().toString());
console.log(new A().toString());
console.log(new test().toString());
console.log(new test().toString());
console.log(new B().toString());
console.log(new B().toString());
我可以解释一下,如果有人感兴趣的话,它为什么起作用。显然,仍然能够看到此问题的人不在乎。
令人沮丧的是,该问题已被关闭并重新定向,因为目标问题未解决此处的基本问题。实际上,几乎每个在目标问题上都回答了这两个问题的人似乎都不了解要点。
我的解决方案对于想要创建更好的结构化Javascript的人很有价值,除非再次打开此页面,否则他们不会看到它。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)