1. 寄生式继承
寄生式继承就是在原型式继承的基础上再封装一层,来增强对象,之后将这个对象返回。
来看看伪代码
function createAnother (original) {
const clone = Object.create(original);; // 通过调用 Object.create() 函数创建一个新对象
clone.fn = function () {}; // 以某种方式来增强对象
return clone; // 返回这个对象
}
1.1 题目一
了解寄生式继承的使用方式
例如我现在想要继承某个对象上的属性,同时又想在新创建的对象中新增上一些其它的属性。
const cat = {
heart: '❤️',
colors: ['white', 'black']
}
function createAnother (original) {
const clone = Object.create(original);
// 新增方法
clone.actingCute = function () {
console.log('我是一只会卖萌的猫咪')
}
return clone;
}
const guaiguai = createAnother(cat)
const huaihuai = Object.create(cat)
guaiguai.actingCute()
console.log(guaiguai.heart)
console.log(huaihuai.colors)
console.log(guaiguai)
console.log(huaihuai)
答案:
'我是一只会卖萌的猫咪'
'❤️'
['white', 'black']
{ actingCute: ƒ }
{}
理解:
- 两只猫都是通过Object.create()进行过原型式继承cat对象的,所以是共享使用cat对象中的属性
- guaiguai经过createAnother新增了自身的实例方法actingCute,所以会有这个方法
- huaihuai是一只空猫,因为heart、colors都是原型对象cat上的属性
2. 总结
-
实现方式:
- 在原型式继承的基础上再封装一层,来增强对象,之后将这个对象返回。
-
优点:
- 再不用创建构造函数的情况下,实现了原型链继承,代码量减少一部分。
-
缺点:
- 一些引用数据操作的时候会出问题,两个实例会公用继承原型对象的引用数据类
- 谨慎定义方法,以免定义方法也继承对象原型的方法重名,即使重名,也会先调用实例中的重名方法
- 无法直接给父级构造函数使用参数