深入解析JavaScript继承:ES5与ES6的对比与演进

news/2025/2/22 2:56:03/文章来源:https://www.cnblogs.com/zimengxiyu/p/18730508

在JavaScript中,继承是实现代码复用和抽象的核心机制之一。随着ES6(ECMAScript 2015)的推出,类的语法糖(classextends)彻底改变了开发者实现继承的方式。本文将通过对比ES5和ES6的继承实现,揭示其底层原理与核心差异,并探讨为何ES6的继承更符合现代开发需求。

一、ES5的继承:基于原型链的手动实现

1. 核心机制

ES5的继承依赖于原型链和构造函数的组合,需要开发者手动操作原型对象。其实现分为两步:

  1. 继承属性:在子类构造函数中调用父类构造函数(Parent.call(this)),将父类的属性绑定到子类实例。
  2. 继承方法:通过原型链(Child.prototype = Object.create(Parent.prototype))让子类实例共享父类方法。

2. 代码示例

// 父类
function Animal(name) {this.name = name;
}
Animal.prototype.speak = function() {console.log(this.name + " makes a noise.");
};// 子类
function Dog(name, breed) {Animal.call(this, name); // 继承属性this.breed = breed;
}
Dog.prototype = Object.create(Animal.prototype); // 继承方法
Dog.prototype.constructor = Dog; // 修复构造函数指向
Dog.prototype.bark = function() {console.log(this.name + " barks!");
};// 使用
const dog = new Dog("Buddy", "Golden Retriever");
dog.speak(); // "Buddy makes a noise."
dog.bark();  // "Buddy barks!"

3. 缺陷与问题

  • 冗余属性:父类构造函数被调用两次(Animal.call(this)和原型链设置),导致子类原型上可能存在冗余属性。
  • 繁琐的手动操作:需要手动维护原型链和构造函数指向,容易出错。
  • 静态方法不继承:父类的静态方法需手动绑定到子类。

二、ES6的继承:基于classextends的语法糖

1. 核心机制

ES6通过classextends关键字提供了一种更简洁的继承方式,其底层仍基于原型链,但隐藏了复杂的实现细节:

  1. 继承属性:通过super()调用父类构造函数,初始化子类实例的父类属性。
  2. 继承方法:自动设置子类的原型链(Child.prototype.__proto__ === Parent.prototype)。

2. 代码示例

class Animal {constructor(name) {this.name = name;}speak() {console.log(`${this.name} makes a noise.`);}
}class Dog extends Animal {constructor(name, breed) {super(name); // 必须调用super()!this.breed = breed;}bark() {console.log(`${this.name} barks!`);}
}// 使用
const dog = new Dog("Buddy", "Golden Retriever");
dog.speak(); // "Buddy makes a noise."
dog.bark();  // "Buddy barks!"

3. 关键特性

  • 强制调用super():子类构造函数必须调用super()后才能使用this,因为子类实例的创建依赖父类构造函数的初始化。
  • 自动继承静态方法:父类的静态方法(如Parent.staticMethod())会被子类自动继承。
  • 不可枚举的方法:类中定义的方法默认不可枚举(Object.keys(Child.prototype)不会包含它们)。

三、ES5与ES6继承的核心差异

特性ES5ES6
语法 手动操作原型链和构造函数 使用classextends语法糖
super关键字 无,需显式调用父类构造函数(Parent.call 必须调用super()以初始化父类属性
静态方法继承 需手动绑定(Child.__proto__ = Parent 自动继承
原型链设置 手动维护(易出错) 自动处理(Child.prototype.__proto__指向父类)
方法可枚举性 原型方法默认可枚举 类方法不可枚举
构造函数调用次数 父类构造函数可能被调用两次 父类构造函数仅调用一次

 

四、ES6继承的底层原理

尽管ES6的class看似引入了传统面向对象语言的类机制,但其本质仍是基于原型的继承。以下代码揭示了extends的底层行为:

class Parent {}
class Child extends Parent {}// 原型链关系
console.log(Child.prototype.__proto__ === Parent.prototype); // true
console.log(Child.__proto__ === Parent); // true(继承静态方法)

super()的作用:
调用父类构造函数,但其内部this指向子类实例。因此,super()并非创建父类实例,而是为子类实例初始化父类属性。

五、总结

  • ES5的继承是显式的、低级的,要求开发者深入理解原型链。
  • ES6的继承是隐式的、高级的,通过语法糖隐藏复杂性,更贴近现代开发需求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/887886.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开源一款串口舵机驱动扩展板-FreakStudio多米诺系列

总线舵机扩展板通过UART接口控制多个舵机,支持堆叠级联,最多连接4个扩展板。具备小尺寸设计、供电保护、全双工转半双工通信、稳定供电等特点,适用于多舵机控制系统。原文链接: FreakStudio的博客 摘要 总线舵机扩展板通过UART接口控制多个舵机,支持堆叠级联,最多连接4个…

Radialix 汉化

配置属性如下直接翻译文本即可留待后查,同时方便他人 联系我:renhanlinbsl@163.com

pycharm激活码免费分享2025最新

申明:本教程 Pycharm 破解补丁、激活码均收集于网络,请勿商用,仅供个人学习使用,如有侵权,请联系作者删除。若条件允许,希望大家购买正版 !PS: 本教程最新更新时间: 2025年2月1日~前言 笔者几乎试了网上几乎所有的 Pycharm 破解方案,废了好大气力,汇总了目前网上比较靠…

2025牛客寒假算法基础集训营第二场补题

H-一起画很大的圆 原题:H-一起画很大的圆 题意 给定一个矩形区域,在矩形的边界上找到 3 个整数点,使得过这 3 个点画出的圆面积最大,输出这三个点的坐标。 思路 三个不共线的点确定一个圆。 如果这三个点越接近一条直线,这个圆最大。 要使得圆尽可能大,那么这三个点尽量趋…

Level-729-易画行-复现

hgame 易画行复现此题是为了让⼤家稍微了解⼀下区块链。需要的知识是区块链的⼀些基本知识和ipfs的⼀些知识。这道题确实不难,可惜我没有认真学Blockchain,做这个题也没有投入精力,只是看了看,赛后9CVoid师傅给我写了一份解析,在此致谢! 题目给了一个Typescript文件 impo…

Python实现URL自动转二维码的高效方法

Python实现URL自动转二维码的高效方法 安装包依赖 pip install qrcode pip install pillow程序 import qrcode data = "https://www.cnblogs.com/tianwuyvlianshui/"#网址 img = qrcode.make(data) img.save("blogs.png")#生成图片命名运行后将在工程文件夹…

百万架构师第四十二课:Nginx:Nginx 的初步认识|JavaGuide

百万架构师系列文章阅读体验感更佳 原文链接:https://javaguide.net 公众号:不止极客 Nginx 的初步认识及配置 课程目标Nginx 在分布式架构中的应用分析 常用的 Web 服务器及差异 Nginx 的安装以及配置分析 Nginx 虚拟主机配置 详解 Location 的匹配规则背景 早期用 F5 做负载…

清华大学第5弹: 《DeepSeek与AI幻觉》 - 清华大学DeepSeek全套资料完整版 - 持续更新 - PDF免费下载

《DeepSeek与AI幻觉》报告探讨了AI幻觉的成因、评测方法及其影响,并以DeepSeek模型为例,分析数据偏差、知识固化等问题如何导致幻觉现象。报告还提出缓解策略,如联网搜索、提示词优化,并探讨AI幻觉在科学创新和艺术创作中的潜在价值。由清华大学新闻与传播学院与人工智能学…

win系统查看wife连接密码

win系统查看wife连接密码 1、win+R ,打开cmd 2、查看本机连过的WiFi名 netsh wlan show profiles3、获取WIFI密码 netsh wlan show profiles “WIFI名” key=clear密码如下

crypto做题记录

buuctf--wp Crypto 权限获得第一步: 看样子是windows系统存储用户密码哈希值的格式,密文一般存储在C:\Windows\System32\config\SAM文件中,只有具有管理员权限的用户才能通过特定工具(hashdump,pwdump)访问SAM文件,进行密码重置等操作。 下图表示用户名: 用户RID:500(用…

若依框架常见问题一

错误一:问题出在configuration和configLocation重复,如下图:修改方法也很简单,只要删除掉application.yml文件中的以下就可以解决:

Cypher Chapter 5: MECHANISED CRYPTOGRAPHY

Chapter 5: MECHANISED CRYPTOGRAPHY 恩格玛机示意图:谜题围绕恩格玛机展开。 PUZZLE1 Input/output: ABCDEFGHIJKLMNOPQRSTUVWXYZScrambler I: ABCDEFGHIJKLMNOPQRSTUVWXYZ UWYGADFPVZBECKMTHXSLRINQOJReflector: ABCDEFGHIJKLMNOPQRSTUVWXYZ YRUHQSLDPXNGOKMIEBFZCWVJATCiph…