首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

红宝书第十一讲:超易懂版「ES6类与继承」零基础教程:用现实例子+图解实现

  • 25-04-18 10:00
  • 2498
  • 11400
juejin.cn

红宝书第十一讲:超易懂版「ES6类与继承」零基础教程:用现实例子+图解实现

资料取自《JavaScript高级程序设计(第5版)》。 查看总目录:红宝书学习大纲


一、ES6类的核心语法:把事物抽象成“模板”

想象你要设计一款「动物养成游戏」,需要创建多种动物对象。ES6的class就是一个代码模板:

javascript
代码解读
复制代码
// 基础类(Animal是模板,有名称和吃东西方法) class Animal { constructor(name) { // 构造函数,初始化属性 this.name = name; } // 实例方法(所有动物都会吃) eat(food) { console.log(`${this.name}吃${food}`); } // 静态方法(属于类本身,动物总数统计) static count() { console.log(`动物园共有${Animal.total}只动物`); } } Animal.total = 0; // 静态属性(新语法需使用static声明) // 创建实例 const dog = new Animal("旺财"); dog.eat("骨头"); // "旺财吃骨头" ✅ Animal.total++; // 静态属性通过类名访问 Animal.count(); // "动物园共有1只动物"

🎯 重点说明:

  • constructor():相当于设定初始值的函数(new触发)
  • 实例方法:定义行为(如eat(),需实例调用)
  • static静态方法:属于类本身(如count(),类直接调用)

二、继承:子类复用父类能力的秘诀

假设需要新增「猫类」,会继承动物的基础能力,并新增「爬树」方法:

javascript
代码解读
复制代码
class Cat extends Animal { // ✨关键:extends继承 constructor(name, color) { super(name); // 🔑调用父类构造函数 this.color = color; } // 新增方法(只有猫会爬树) climbTree() { console.log(`${this.name}正在爬树`); } // 覆盖父类方法(修改猫的吃法) eat(food) { super.eat(food); // 复用父类的eat方法 console.log("优雅地舔爪子!"); } } // 测试继承 const cat = new Cat("小白", "白色"); cat.eat("鱼"); // "小白吃鱼" // "优雅地舔爪子!" ✅ cat.climbTree(); // "小白正在爬树" ✅ console.log(cat instanceof Animal); // true ✅
prototype
prototype
__proto__
__proto__
Animal类
Cat类
Animal.prototype
Cat.prototype
cat实例
AnimalProto包含eat方法
CatProto包含climbTree方法和覆盖的eat方法

语法要点:

  1. extends关键字:让子类继承父类
  2. super():调用父类构造函数(必须放在子类构造第一行)
  3. 方法覆盖:子类可重写父类方法(比如eat())

三、继承的原理:原型链的“自动连接”

ES6类本质是基于原型的语法糖(背后仍用原型链实现继承)1。通过extends,子类的原型会指向父类的实例:

javascript
代码解读
复制代码
// 手动验证原型链 console.log(Cat.prototype.__proto__ === Animal.prototype); // true ✅
  • 子类实例先找自身方法 → 找不到则沿原型链向上查找(父类→祖父类...)

四、特殊继承技巧:继承传统构造函数

ES6类还可以继承旧版JS的函数构造函数(保持兼容性)2:

javascript
代码解读
复制代码
// ES5风格的构造函数(旧代码) function Person(name) { this.name = name; } Person.prototype.sayHi = function() { console.log(`你好,我是${this.name}`); }; // ES6类继承构造函数 class Engineer extends Person { constructor(name, skill) { super(name); this.skill = skill; } } const engineer = new Engineer("张三", "JavaScript"); engineer.sayHi(); // "你好,我是张三" ✅

✅ 说明:旧代码无需修改,可直接用extends继承!


五、总结表格:ES6类语法速查

功能语法示例说明
定义类class 类名 { ... }大写开头,驼峰命名
构造函数constructor() { ... }只能有一个构造函数
定义实例方法方法名() { ... }实例调用
静态方法/属性static 方法名() { ... }类名调用,如Animal.count()
继承父类class 子类 extends 父类 { ... }子类继承父类能力
调用父类构造函数super(参数)必须放在子类构造第一行
调用父类方法super.父类方法名()eat()中调用父类方法

目录:总目录 上篇文章:红宝书第十讲:「构造函数与原型链」入门及深入解读:用举例子+图画理解“套娃继承”

脚注

Footnotes

  1. ES6类本质是对原型继承的语法封装,保留原型链特性但语法更清晰。来源:《JavaScript高级程序设计(第5版)》指出ES6类是对传统原型方式的抽象优化。 ↩

  2. extends关键字不仅支持类间的继承,还可兼容旧版函数构造函数实现继承。来源:《JavaScript高级程序设计(第5版)》中关于Engineer类继承Person构造函数的示例。 ↩

注:本文转载自juejin.cn的kovli的文章"https://juejin.cn/post/7493792787401048104"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2491) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top