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

如何让子类对象不继承父类的特定方法或属性?

解决方案

首先明确两个核心点:

  • 父类的私有字段#score本身具备类级别的私有性,子类AIPlayer无法访问或继承父类的#score,JavaScript的私有字段机制已经天然满足这一需求,无需额外处理。
  • 对于setName()方法,我们可以通过子类重写该方法并抛出错误实现调用触发报错的效果;同时重写getName()方法返回固定值。

修改后的代码实现

class Player {
  #name;
  #marking;
  #score;
  constructor(){
   this.#name = undefined;
   this.#marking = undefined;
   this.#score = {wins:0,defeats:0};
  }
  action(){/* 父类原有实现 */}
  
  getName(){
    return this.#name;
  }
  setName(name){
    this.#name = name;
  }
  // 其他父类方法
 }

 class AIPlayer extends Player{
  #name; // 定义子类自己的私有name字段
  constructor(){
   super();
   this.#name = "AI-0.1.2";
  }
  action(){/* 子类重写的实现 */}

  // 重写setName,调用时抛出错误
  setName() {
    throw new Error("AIPlayer cannot modify name via setName()");
  }

  // 重写getName,返回固定的AI名称
  getName() {
    return this.#name;
  }
  
  // 子类其他方法
 }
  
 const p1 = new Player();
 p1.setName("Mr.Banana");
 console.log(p1.getName()); //-> Mr.Banana

 const AIP0 = new AIPlayer();
 AIP0.setName("stupid computer"); //-> 抛出错误:AIPlayer cannot modify name via setName()
 console.log(AIP0.getName()); //-> AI-0.1.2

补充说明

  1. 私有字段独立性:子类AIPlayer中定义的#name是属于自身的私有字段,和父类Player的#name完全独立,不会互相影响,确保AI名称不会被父类方法意外修改。
  2. 方法重写的作用:重写setName()并抛出错误,直接阻止外部调用该方法修改AI名称的行为;重写getName()则确保返回预设的固定名称,完全匹配需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 23:21:08