JavaScript中修改父类实现子类answer方法参数交换(不可改子类)
解决方法:通过Parent构造函数拦截并修改Child实例的answer方法
要实现这个需求,核心思路是在Parent类的构造函数中,动态替换Child实例的answer方法,让它在调用原方法时自动交换x和y参数。因为Child继承自Parent,创建Child实例时会先执行Parent的构造函数,我们可以利用这个时机修改实例的方法逻辑。
具体代码如下:
class Parent { constructor() { // 检查当前实例是否拥有answer方法(即判断是否为Child实例) if (typeof this.answer === 'function') { // 保存原始的answer方法,避免被覆盖后丢失 const originalAnswer = this.answer; // 替换为新的方法,调用时自动交换x和y参数 this.answer = function(x, y) { return originalAnswer.call(this, y, x); }; } } } class Child extends Parent { answer(x, y) { this.x = x; this.y = y; return 75 - this.x + this.y; } } // 验证结果 let v = new Child(); console.log(v.answer(5, 15) === 65); // true console.log(v.answer(15, 5) === 85); // true
原理说明:
- 当执行
new Child()时,JavaScript会先调用父类Parent的构造函数。 - 在
Parent的构造函数中,我们检测到当前实例(Child实例)存在answer方法,于是先把原始方法保存下来。 - 接着给实例重新赋值一个
answer方法,这个新方法会把传入的x和y参数交换后,再调用原始的answer方法。 - 原Child类的
answer逻辑完全不需要修改,就能实现参数交换后的计算结果,完美匹配预期的两个断言。
内容的提问来源于stack exchange,提问作者blz
相关产品推荐
相关产品推荐

