1.原型链继承

        // 1. 原型链继承
        function A() { }
        function B() { }
        B.prototype = new A();
        let a = new B();

缺点:1.原型中包含的引用值会在实例间共享2.子类型在实例化时不能给父类型构造函数传参

2.盗用构造函数继承(经典继承)

        // 2. 经典继承
        function A(params) { }
        function B() {
            A.call(this, params)
        }
        let a = new B();

缺点:1.子类不能访问父类原型上定义的方法

3.组合继承

        // 3.组合继承
        function A(params) { }
        function B() {
            A.call(this, params)
        }
        B.prototype = new A();
        let a = new B()

缺点:1.存在效率问题,父类构造函数始终会被调用两次

4.原型式继承

        // 4.原型式继承
        let obj = {
            name: '星空海绵',
            getName: function () {
                return this.name
            }
        }
        function object(o) {
            function F() { }
            F.prototype = o;
            return new F();
        }
        let obj1 = object(obj);

Object.create的原理就是原型式继承

缺点:原型式继承和原型链继承缺点一样,原型中包含的引用值会在实例间共享。

优点:适合不需要单独创建构造函数,但是需要对象间共享信息的场景。

5.寄生式继承

        // 5.寄生式继承
        let obj = {
            name: '星空海绵'
        }
        function object(o) {
            function F() { }
            F.prototype = o;
            return new F();
        }
        function A(o) {
            let clone = object(o);
            clone.getName = function () {
                return this.name
            }
            return clone
        }
        let obj1 = A(obj);

缺点:寄生式继承给对象添加的函数会导致函数难以重用

6.寄生式组合继承

        // 6.寄生式组合继承
        function object(o) {
            function F() { }
            F.prototype = o;
            return new F();
        }
        function inheritPrototype(B, A) {
            let prototype = object(A.prototype);
            prototype.constructor = B;
            B.prototype = prototype;
        }
        function A(params) { }
        function B() {
            A.call(this, params)
        }
        inheritPrototype(B, A);

寄生式组合继承可以算是引用类型的最佳模式

7.类继承

        // 7.类继承
        function A() {
            this.name = '星空海绵'
        }
        class B extends A { }
        let a = new B()

ES6新增的语法,背后使用的依然是原型链。

完!