JavaScript:如何引用子类化(可能已被重写)的静态属性
解决JavaScript类实例方法访问最近静态变量的问题
问题原因
你代码里的this.foo返回undefined,是因为this指向实例对象,而foo是类的静态属性(属于类本身,不属于实例),实例上并没有foo属性,所以找不到。
解决方案
在实例方法中,通过this.constructor获取当前实例所属的类,再访问该类的静态属性foo。this.constructor会自动指向创建实例的类(父类或子类),沿着原型链找到最近的静态foo,完全不需要硬编码类名,支持子类扩展。
修正后的代码
class A { static foo = "default" run() { console.log(this.constructor.foo) } } class B extends A { } class C extends A { static foo = "overridden" } const a = new A() a.run() // 输出 "default" const b = new B() b.run() // 输出 "default" const c = new C() c.run() // 输出 "overridden"
补充说明
如果遇到子类手动修改了constructor属性的极端情况,可以用Object.getPrototypeOf(this).constructor来确保获取正确的类,但绝大多数场景下this.constructor已经足够可靠。
内容的提问来源于stack exchange,提问作者run_the_race
相关产品推荐
相关产品推荐

