Javascript:从子类方法访问类变量

问题描述

在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 (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...