You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

原理说明:

  1. 当执行new Child()时,JavaScript会先调用父类Parent的构造函数。
  2. 在Parent的构造函数中,我们检测到当前实例(Child实例)存在answer方法,于是先把原始方法保存下来。
  3. 接着给实例重新赋值一个answer方法,这个新方法会把传入的x和y参数交换后,再调用原始的answer方法。
  4. 原Child类的answer逻辑完全不需要修改,就能实现参数交换后的计算结果,完美匹配预期的两个断言。

内容的提问来源于stack exchange,提问作者blz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:28:29