SOURCE

/**【原型链继承】
 * 子类原型指向父类实例
 * 
 * [好处]子类可以访问到父类新增原型方法和属性
 * [坏处]无法实现多继承;创建实例不能传递参数
 */
function Parent1(){ }
function Child1(){ }
Child1.prototype = new Parent1();
const child1 = new Child1()


/**【构造函数】
 * 
 * [好处]可以实现多继承;创建实例可以传递参数
 * [坏处]实例并不是父类的实例,只是子类的实例;
 *      不能继承父类原型上的方法
 */
function Parent2(){ }
function Child2(...args){
    Parent2.call(this,...args) // Parent2.apply(this,args)
}
const child2 = new Child2(1)

/**【组合继承】
 * 
 * [好处]属性和原型链上的方法都可以继承;
 *      创建实例可以传递参数
 */
function Parent3(){ }
function Child3(...args){
    Parent3.call(this,...args)
}
Child3.prototype = Object.create(Parent3.prototype)
Child3.prototype.constructor = Child3
const child3 = new Child3(1)

/**【对象继承】
 * 
 * [好处]可以继承属性和方法
 * [坏处]创建实例无法传递参数;
 *      传入对象的属性有引用类型,所有类型都会共享相应的值
 */
//通过Object.create
const Parent4_1 = {prototype:'value',method(){ } }
const Child4_1 = Object.create(Parent4_1)
//自定义create方法
const Parent4_2 = {prototype:'value',method(){ } }
function create4(obj){
    function F(){ }
    F.prototype = obj;
    return new F()
}
const child4 = create4(Parent4_2)

/**【寄生组合继承】
 * 
 */
function Parent5(){ }
function Child5(...args){
    Parent5.call(this,...args)
}
function create5(obj){
    function F(){ }
    F.prototype = obj
    return F()
}
function extend5(Child,Parent){
    const clone = create5(Parent.prototype)
    clone.constructor = Child;
    Child.prototype = clone;
}
extend5(Child5,Parent5)
const child5 = new Child5(1)

/**【es6继承】
 * 
 */
class Parent6 {
    constructor(property){//property译为财产
        this.property = property
    }
    method(){ }
}
class Child6 extends Parent6{
    constructor(property){
        super(property)
    }
}
console 命令行工具 X clear

                    
>
console