对于JS继承详细介绍( 原型链,构造函数,组合,原型式,寄生式,寄生组合,Class extends)
说实在话,以前我只需要知道“寄生组合继承”是最好的,有个祖传代码模版用就行。最近因为一些事情,几个星期以来一直心心念念想整理出来。本文以《JavaScript高级程序设计》上的内容为骨架,补充了ES6 Class的相关内容,从我认为更容易理解的角度将继承这件事叙述出来,希望大家能有所收获。 继承分类 JS中继承可以按照是否使用object函数(在下文中会提到),将继承分成两部分(Object.create是ES5新增的方法,用来规范化这个函数)。 其中,原型链继承和原型式继承有一样的优缺点,构造函数继承与寄生式继承也相互对应。寄生组合继承基于Object.create, 同时优化了组合继承,成 JavaScript中的继承机制是其面向对象特性的重要组成部分,它允许创建基于现有对象的新对象,从而能够重用和扩展功能。在JavaScript中,有多种继承实现方式,包括原型链继承、构造函数继承、组合继承、原型式继承、寄生式继承以及寄生组合继承。随着语言的发展,ES6引入了`Class`关键字和`extends`来简化继承的实现,但其底层机制仍基于这些经典模式。 1. **原型链继承**: - 原型链继承的核心在于通过`__proto__`或`Object.create()`将父类的实例设置为子类的原型。 - 子类的实例可以直接访问父类的属性和方法,实现了资源共享。 - 缺点是父类的所有实例共享引用类型属性,可能造成数据混乱。 - `SubType.prototype = new SuperType()`会导致父类构造函数被调用,创建不必要的父类实例。 2. **构造函数继承**: - 构造函数继承通过`SuperType.call(this)`在子类构造函数内部调用父类构造函数,将父类的状态复制给子类实例。 - 这种方式避免了引用类型属性的共享,但无法复用父类的方法,每个子类实例都有独立的方法副本。 3. **组合继承**: - 结合了原型链和构造函数继承的优点,既能复用父类方法,又能独立初始化实例属性。 - 缺点是由于两次调用父类构造函数,可能会导致性能损失,并产生冗余属性。 4. **原型式继承**: - 通过创建一个临时的构造函数并让其原型等于目标对象,实现对目标对象的浅复制。 - 使用`Object.create()`可以规范化此过程,提供更安全的继承。 - 缺点是同样存在引用类型属性共享的问题,且无法传递构造函数参数。 5. **寄生式继承**: - 在原型式继承基础上,返回一个修改后的父类副本,以避免直接修改父类对象。 - 这种方式可以解决原型式继承中不能传递参数的问题。 6. **寄生组合继承**: - 被认为是最理想的继承方式,结合了寄生式继承(避免构造函数的额外开销)和组合继承(复用父类方法)。 - 具体做法是先通过寄生式继承创建一个没有实例属性的父类副本,然后将这个副本赋值给子类的原型。 7. **ES6 Class extends**: - ES6引入的`Class`和`extends`关键字提供了更简洁的语法糖,底层实现与寄生组合继承相似。 - `class SubType extends SuperType`会在子类中创建一个指向父类原型的链接,并调用父类构造函数,但避免了冗余属性的创建。 理解这些继承方式有助于开发者根据实际需求选择最合适的实现,同时也能深入理解JavaScript的内部工作原理。在实际开发中,通常会根据项目特点和性能要求选择寄生组合继承或使用ES6的`Class`和`extends`。
- 粉丝: 5
- 资源: 931
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助