如何获取自身类引用?实现PHP中self::的JavaScript等效功能
在JavaScript中实现类似PHP
self:: 的类自身引用效果 好问题!在JavaScript里确实没有像PHP中self::那样直接指向当前类的关键字,但我们可以通过访问类的原型来实现同样的效果——也就是在父类构造函数中,既调用子类重写后的方法,又调用父类自身的原始方法。
先回顾一下你给出的PHP示例的核心行为:
当实例化
B时,A的构造函数里$this->foo()会调用子类B的foo(输出2),而self::foo()会严格调用A自身的foo(输出1);B的构造函数里$this->foo()和self::foo()都调用B的foo(输出22)。
解决方案1:直接访问父类原型方法(简单直观)
在JavaScript中,类的实例方法会挂载到类的prototype属性上。我们可以直接通过父类名.prototype.方法名来获取父类的原始方法,再用call(this)确保方法内部的this指向当前实例(和this.foo()的上下文一致)。
完整代码示例:
class A { constructor(){ this.foo(); // 调用子类B的foo,输出2 // 调用A自身的foo方法 A.prototype.foo.call(this); } foo(){ console.log(1); } } class B extends A { constructor(){ super(); this.foo(); // 调用B的foo,输出2 // 调用B自身的foo方法(对应PHP的self::foo()) B.prototype.foo.call(this); } foo(){ console.log(2); } } new B(); // 输出顺序: // 2 // 1 // 2 // 2
解决方案2:动态获取类引用(避免硬编码类名)
如果不想硬编码类名(比如类名可能会修改),可以通过原型链动态获取父类的引用:
class A { constructor(){ this.foo(); // 动态获取A类的原型方法 const parentProto = Object.getPrototypeOf(Object.getPrototypeOf(this)); parentProto.foo.call(this); } foo(){ console.log(1); } }
这种方式通过Object.getPrototypeOf逐层获取原型链:
Object.getPrototypeOf(this)获取实例的直接原型(即B.prototype)- 再调用一次
Object.getPrototypeOf得到A.prototype,进而拿到A的foo方法
关键说明
- JavaScript中
this.foo()会遵循原型链查找,优先调用子类重写的方法,这和PHP中$this->foo()的行为一致。 - 要调用类自身的原始方法,必须直接访问类的
prototype上的方法,因为子类的原型会覆盖父类原型中的同名方法。
内容的提问来源于stack exchange,提问作者blz
相关产品推荐
相关产品推荐

