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

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 靠原型链实现! 👨👦
http://www.xdnf.cn/news/3162.html

相关文章:

  • 解密Cloak斗篷技术:FP独立站推广利器
  • [论文阅读]Adversarial Semantic Collisions
  • 为什么要学习《易经》?
  • 大模型核心技术及架构解析
  • Android Q允许低内存启用系统弹窗
  • 蓝桥杯算法开发企业级实战指导:从0到1的C/C++全攻略
  • kubelet 清理资源以缓解磁盘压力
  • 考OCM证书前需要有OCP证书
  • 再谈cookie和session(结合表白墙具体案例)
  • 第一讲 | 算法复杂度
  • Jmeter接口自动化测试读取用例
  • 软件设计师-软考知识复习(2)
  • 边缘计算服务器
  • C++类和对象(2)关于类的默认成员函数
  • python初学
  • 【论文_序列转换模型架构_20230802v7】Attention Is All You Need 【Transformer】
  • Android第五次面试总结之网络篇(修)
  • 经典算法 最长单调递增子序列
  • Stable Diffusion基础配置
  • 使用 v-print 实现 Vue 项目中的打印功能
  • rust 全栈应用框架dioxus
  • 深入解析常见排序算法及其 C# 实现
  • 系统思考培训助力总经理
  • AI预测3D新模型百十个定位预测+胆码预测+去和尾2025年4月29日第67弹
  • RISE with SAP 的合同及许可解析
  • 【电子对抗训练革命】新一代便携式雷达模拟器技术解密
  • Spring事务开发经验 回滚和不回滚?
  • ADS1299模拟前端(AFE)代替芯片——LHE7909
  • C事件驱动网络库​​libevent的http详解
  • Java实现使用EasyExcel按模板导出文件