一、构造函数继承
(一) Call/apply 继承
(二) Call 与 apply 的异同:
1. 第一个参数 this 都一样,指当前对象
2. 第二个参数不一样:call 的是一个个的参数列 表;apply 的是一个数组(arguments 也可以)
(三) 构造继承特点:
- 子类实例共享父类引用属性的问题
- 创建子类实例时,可以向父类传递参数
- 可以实现多继承(call 或 apply 多个父类对象)
(四) 构造继承缺点: - 实例并不是父类的实例,只是子类的实例
- 只能继承父类的实例属性和方法,不能继承原 型属性和方法
- 无法实现函数复用,每个子类都有父类实例函 数的副本,影响性能
二、Prototype 的概念
(一) Javascript 中的每个函数都有 prototype 属性, 指向函数的原型对象。每一个对象都有__proto_ _属性,指向该对象的父对象。
三、原型链继承
(一) 特点:
- 非常纯粹的继承关系,实例是子类的实例,也 是父类的实例
- 父类新增原型方法/原型属性,子类都能访问 到
- 简单,易于实现
(二) 缺点: - 要想为子类新增原型属性和方法,必须要在 new 父类()这样的语句之后执行。要想为 子类新增实例属性和方法,必须要在构造函数
中添加。 - 无法实现多继承
- 来自原型对象的所有属性被所有实例共享
四、混合继承
(一) 特点:
4. 可以继承实例属性和方法,也可以继承原型属 性和方法
4. 既是子类的实例,也是父类的实例
5. 不存在引用属性的共享问题
6. 可传参
5. 函数可复用
(二) 缺点: 1. 调用了两次父类构造函数,生成了两份实例 五、扩展:寄生组合继承 (一) 特点: 1. 完美