1、原型式继承
原型式继承是对类式继承的一部分封装调整,类式继承在父类的外部,单独创建了一个子类,然后再通过将父类对象给到子类的原型上去实现的,而原型式继承是直接在父类内部创建一个过渡对象,将父类的对象给到过渡对象上的原型上去,在返回一个过渡对象实例出去。
-
优点:
相较于类式继承,减少了内存的开销(过渡对象中无其他内容),因为原型式继承的目的就是为了直接创建并返回一个新的实例化对象。
// 原型继承
inHeritObject(o) {
// 创建一个过渡对象
function F() {}
// 将父类对象的给过渡对象的原型对象上
F.prototype = o;
// 返回新的实例化对象
return new F();
}
-
缺点:
未解决类式继承带来的相同的问题点,引用类型的数据,一个子实例修改后,会导致所有的子实例的该数据都被修改。
// 创建一个对象作为父类
let Book = {
name: 'javascript设计模式',
list: ['1','2','3','4','5']
}
let b1 = this.inHeritObject(Book);
let b2 = this.inHeritObject(Book);
console.log(b2.list); // 在b1修改前打印list数组
b1.name = 'RXJS函数式编程';
b1.list.push('6');
console.log(b2.list); // 在b1修改后打印list数组
2、寄生式继承
寄生式继承就是对继承对象的进一步封装拓展。
// 原型继承
inHeritObject(o) {
// 创建一个过渡对象
function F() {}
// 将父类对象的给过渡对象的原型对象上
F.prototype = o;
// 返回新的实例化对象
return new F();
},
// 寄生式继承
parasiticObject(o) {
const obj = this.inHeritObject(o);
obj.getName = function() {
console.log(this.name);
}
return obj;
}
使用寄生式调用拓展的对象属性和方法:
let b1 = this.parasiticObject(Book);
let b2 = this.parasiticObject(Book);
b1.getName();