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

Javascript 中的继承?如何实现继承?

一、继承的本质

  • 继承:子对象可以自动拥有父对象的属性和方法,就像孩子继承父母的基因。
  • JavaScript 的继承:通过原型链实现(原型和原型链是底层核心)。

二、4 种常见继承方式

1. 原型链继承(传家宝模式)
  • 原理:将父类的实例作为子类的原型
  • 优点:子类能继承父类原型上的方法
  • 缺点:所有子类实例共享父类的引用属性(如数组、对象)
function 父亲() {this.财产 = ["房子", "车子"];
}
父亲.prototype.姓氏 = "张";function 儿子() {}
儿子.prototype = new 父亲(); // 继承const 大儿子 = new 儿子();
大儿子.财产.push("存款"); // 修改会影响所有子类
const 二儿子 = new 儿子();
console.log(二儿子.财产); // ["房子", "车子", "存款"](问题!)

2. 构造函数继承(复制家产模式)
  • 原理:在子类构造函数中调用父类构造函数
  • 优点:每个子类实例有独立的属性
  • 缺点:无法继承父类原型上的方法
function 父亲() {this.=;
}
父亲.prototype.说姓氏 = function() {console.log("我姓" + this.);
};function 儿子() {父亲.call(this,); // 继承属性
}const 小明 = new 儿子("王");
console.log(小明.); // "王"
小明.说姓氏(); // 报错!(无法继承原型方法)

3. 组合继承(家产+家训双传模式)
  • 原理:原型链继承 + 构造函数继承组合
  • 优点:既能继承属性,又能继承原型方法
  • 缺点:父类构造函数被调用两次,效率略低
function 父亲() {this.=;
}
父亲.prototype.说姓氏 = function() {console.log("我姓" + this.);
};function 儿子(,) {父亲.call(this,); // 第1次调用父构造函数(继承属性)this.=;
}
儿子.prototype = new 父亲(); // 第2次调用父构造函数(继承原型)
儿子.prototype.constructor = 儿子; // 修复构造函数指向const 小明 = new 儿子("张", "小明");
小明.说姓氏(); // "我姓张"

4. 寄生组合继承(完美模式)
  • 原理:通过拷贝父类原型,避免重复调用父类构造函数
  • 优点:解决组合继承的效率问题
  • 推荐:ES6 class 继承的底层实现方式
function 继承原型(子类, 父类) {const 原型副本 = Object.create(父类.prototype); // 复制父类原型原型副本.constructor = 子类; // 修正构造函数子类.prototype = 原型副本;
}function 父亲() {this.=;
}
父亲.prototype.说姓氏 = function() {console.log("我姓" + this.);
};function 儿子(,) {父亲.call(this,); // 只调用一次父构造函数this.=;
}
继承原型(儿子, 父亲); // 继承原型方法const 小明 = new 儿子("李", "小明");
小明.说姓氏(); // "我姓李"

三、现代写法(ES6 class 语法糖)

class 父亲 {constructor() {this.=;}说姓氏() {console.log(`我姓${this.}`);}
}class 儿子 extends 父亲 {constructor(,) {super(); // 相当于 Father.call(this, 姓)this.=;}
}const 小明 = new 儿子("赵", "小明");
小明.说姓氏(); // "我姓赵"
  • 本质classextends 是语法糖,底层基于寄生组合继承。

四、继承方式对比

继承方式优点缺点适用场景
原型链继承简单共享引用属性小型项目
构造函数继承独立属性无法继承原型方法需要属性隔离
组合继承属性独立 + 继承原型方法父类构造函数调用两次传统项目
寄生组合继承最优解实现稍复杂中大型项目
ES6 class语法简洁需支持 ES6现代项目

总结

  • 核心原则:通过原型链实现属性和方法的传递。
  • 推荐方案
    • 现代项目:直接用 ES6 class
    • 传统项目:手动实现寄生组合继承
  • 一句话记忆:继承就是「子承父业」,JavaScript 靠原型链实现! 👨👦

相关文章:

  • docker-vllm运行大模型
  • 高翔视觉slam中常见的OpenCV和Eigen的几种数据类型的内存布局及分配方式详解
  • 从代码学习深度学习 - 目标检测前置知识(一) PyTorch 版
  • 5.4.2 MVVM例2-用户控件的使用(水在水管中流动的实例)
  • 快速了解Go+rpc
  • MATLAB画一把伞
  • React Three Fiber 详解:现代 Web3D 的利器
  • Vue3取消网络请求的方法(AbortController)
  • jmeter-Beashell获取http请求体json
  • Flutter:组件10、倒计时
  • python如何流模式输出
  • rsync命令详解与实用案例
  • SQLyog中DELIMITER执行存储过程时出现的前置缩进问题
  • 全局id生成器生产方案
  • 23种设计模式-行为型模式之中介者模式(Java版本)
  • 【C++】模板为什么要extern?
  • Cursor —— AI编辑器 使用详解
  • PDF Shaper v15.0
  • vscode chrome调试怎么在所有浏览器都好使
  • 客运从业资格证考试科目有哪些
  • 证据公布!菲律宾6人非法登上铁线礁活动
  • 阿里开源首个“混合推理模型”:集成“快思考”、“慢思考”能力
  • 来伊份一季度净利减少近八成,今年集中精力帮助加盟商成功
  • “五一”假期倒计时,节前错峰出游机票降价四成
  • 国家税务总局:“二套转首套”可以享受贷款利息个税专项扣除
  • 马上评丨发钱奖励结婚,支持婚育就该系统性发力