如何让子类对象不继承父类的特定方法或属性?
解决方案
首先明确两个核心点:
- 父类的私有字段
#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
补充说明
- 私有字段独立性:子类
AIPlayer中定义的#name是属于自身的私有字段,和父类Player的#name完全独立,不会互相影响,确保AI名称不会被父类方法意外修改。 - 方法重写的作用:重写
setName()并抛出错误,直接阻止外部调用该方法修改AI名称的行为;重写getName()则确保返回预设的固定名称,完全匹配需求。
内容的提问来源于stack exchange,提问作者JEmerson23
相关产品推荐
相关产品推荐

