/*
组合继承是 JavaScript最常用的继承模式,
其最大的问题是不管在什么情况下都会调用两次超类构造函数:
一次是在创建子类原型时,一次是在子类型构造函数内部。
子类型最终会包含超类的全部实例属性。
所谓寄生组合式继承,即通过构造函数来继承属性,通过原型链继承方法,
背后的基本思路是:不必为了指定子类的原型而调用父类的构造函数,
我们所需要的无非就是父类原型的一个副本而已。
*/
// 1.首先创建一个函数
function inherit(child, parent) {
// child 子类
// parent 父类
// 复制父类原型
// Object.create()方法用于创建一个新对象,使用现有的对象来作为新创建对象的原型(prototype)
const ParentPrototype = Object.create(parent.prototype)
// 赋值给子类原型
child.prototype = ParentPrototype
// 子类 constructor 指回 child
child.prototype.constructor = child
}
// Object.create(parent) => 返回一个新对象 新对象的原型 parent
// function create(o) {
// function F() {}
// F.prototype = o;
// return new F();
// }
//总结
/*
inherit() 函数实现了寄生组合式继承的最简单形式,
参数有两个:子类构造函数和父类构造函数。
在函数内部进行了三步操作:第一步是创建超类原型的一个副本(parent),第二步是将新创建的对象赋值给子类的原型(Object.create(parent.prototype))。
最后一步,为创建的副本添加 constructor 属性(child.prototype.constructor = child),从而弥补因重写原型而失去的默认的 constructor 属性。
*/