当前位置: 首页 > news >正文

如何通过原型链实现方法的“重写”(Override)?

在 JavaScript 中,通过原型链实现方法的 “重写”(Override) 的核心思路是:在子类(或子对象)的原型链上定义同名方法,覆盖父类(或父对象)的方法。以下是具体实现步骤和代码示例:


1. 原型链方法重写的原理

  • 原型链查找规则
    当调用对象的方法时,JavaScript 会优先在对象自身查找该方法,若未找到则沿原型链向上查找,直到找到第一个匹配的方法或到达链末端(null)。
  • 重写本质
    在子类原型链的 更近层级 定义同名方法,覆盖父类的方法,阻断原型链的继续查找。

2. 实现方法重写的步骤

(1) 定义父类及其原型方法
function Animal(name) {this.name = name;
}// 父类原型方法
Animal.prototype.eat = function() {console.log(this.name + " is eating.");
};
(2) 定义子类并继承父类原型链
function Dog(name) {Animal.call(this, name); // 继承父类实例属性
}// 建立原型链继承关系
Dog.prototype = Object.create(Animal.prototype);
Dog.prototype.constructor = Dog; // 修复 constructor
(3) 在子类原型上重写父类方法
// 重写 eat 方法
Dog.prototype.eat = function() {console.log(this.name + " eats dog food."); // 自定义逻辑
};
(4) 可选:在子类方法中调用父类方法(类似 super
Dog.prototype.eat = function() {Animal.prototype.eat.call(this); // 调用父类方法console.log("Then drinks water.");
};

3. 测试重写效果

const animal = new Animal("Generic Animal");
const dog = new Dog("Buddy");animal.eat(); // "Generic Animal is eating."
dog.eat();    // "Buddy eats dog food."(重写后的方法)// 若子类方法中调用了父类方法
dog.eat(); 
// 输出:
// "Buddy is eating."(父类方法)
// "Then drinks water."(子类新增逻辑)

4. ES6 class 语法中的方法重写

ES6 的 class 语法通过 extendssuper 更简洁地实现方法重写:

class Animal {constructor(name) {this.name = name;}eat() {console.log(`${this.name} is eating.`);}
}class Dog extends Animal {eat() {super.eat(); // 调用父类方法console.log(`${this.name} drinks water.`);}
}const dog = new Dog("Buddy");
dog.eat();
// 输出:
// "Buddy is eating."
// "Buddy drinks water."

关键点总结

行为ES5 原型链实现ES6 class 实现
重写方法在子类原型上定义同名方法在子类中直接定义同名方法
调用父类方法Parent.prototype.method.call(this)super.method()
原型链关系手动设置 Child.prototype = Object.create(Parent.prototype)自动通过 extends 建立
代码可读性较低高(语法更贴近传统面向对象语言)

注意事项

  1. 避免直接修改内置对象原型
    如重写 Object.prototype.toString 可能导致不可预期的行为。
  2. 方法重写的优先级
    对象自身属性 > 子类原型方法 > 父类原型方法。
  3. 性能影响
    频繁重写方法或深层原型链可能影响性能,需合理设计。

通过原型链实现方法重写是 JavaScript 继承和多态的核心机制,理解其原理有助于编写灵活且可维护的代码。

相关文章:

  • Android三种onClick实现方式详细对比
  • 【AI News | 20250416】每日AI进展
  • 知识图谱与其它知识库的关系
  • 决策树:ID3,C4.5,CART树总结
  • 利用XShell 创建隧道(tunnel)在本地可视化远程服务器上的Visdom
  • stateflow中的函数
  • Xenomai 如何实现 <10μs 级抖动控制
  • 远程登录到Linux服务器(介绍,Xshell,Xftp,可能出现的问题)
  • 自由学习记录(55)
  • 强化学习的数学原理(一)基本概念
  • Redis --- 基本数据类型
  • Spark-SQL(三)
  • 方案解读:虚拟电厂总体规划建设方案【附全文阅读】
  • 从零开始学习PX4源码20(遥控器模式切换如何执行)
  • 进程控制(上)【Linux操作系统】
  • 【leetcode100】整数拆分
  • 带宽”(bandwidth)有以下两种不同的意义
  • 41.[前端开发-JavaScript高级]Day06-原型关系图-ES6类的使用-ES6转ES5
  • 【C++游戏引擎开发】第16篇:ImGui指南
  • MTK-Android12 13 屏蔽掉Viewing full screen
  • 怎样建免费网站/怎样推广app别人才愿意下载
  • 广州一起做的网站/谷歌seo优化
  • 潍坊网站建设服务跟/万能浏览器
  • 微信销售小程序/搜索引擎seo关键词优化
  • 网站建设部署与发布有效期/标题优化方法
  • 网站建设优選宙斯站长/服务器