JavaScript中的继承(下)


续:JavaScript中的继承(中)

五、寄生式继承

  寄生式继承和原型式继承紧密相连,基本思想和寄生构造函数类似,即创建一个仅用于封装继承过程的函数,在该函数内部以某种方式来增强对象。最后返回对象
  示例代码如下:
  function object(o) {
        function F() {
        }

        F.prototype = o;
        return new F();
    }

    function createAnother(original) {
        var clone = object(original);
        clone.sayHi = function () {
            console.log('hi');
        };
        return clone;
    }
    var person = {
        name: 'Bob',
        friends: ['Alice', 'Greg']
    };
    var anotherPerson = createAnother(person);
    console.log(anotherPerson.name);//Bob
    console.log(anotherPerson.friends);//["Alice", "Greg"]
    anotherPerson.sayHi();//hi

  由以上代码可以看到:anotherPerson继承了person的属性和方法,同时增加了自己的sayHi方法   缺点:每个对象都有自己的副本,不能做到函数复用而降低效率


六、寄生组合式继承

  寄生组合式继承是利用寄生式继承对组合继承进行优化而来。
  关于组合式继承请参考JavaScript中的继承(中),这里我们分析一下传统组合式继承的缺点:无论什么时候,都会两次调用父类型的构造函数,一次是在创建子类型的原型的时候(创建一个父类型的实例作为子类型的原型);另一次是在子类型的构造函数内部调用父类型的构造函数(获得父类型属性的一个副本);举例如下:
 function SuperType(name) {
        this.name = name;
        this.colors = ['red', 'blue'];
    }
    SuperType.prototype.sayName = function () {
        console.log(this.name);
    };
    function SubType(name, age) {
        SuperType.call(this, name);//第二次调用SuperType()
        this.age = age;
    }
    SubType.prototype = new SuperType();//第一次调用SuperType()
    SubType.prototype.constructor=SubType;
    SubType.prototype.sayAge = function () {
        console.log(this.age);
    };

  从以上代码可以看到,第一次调用SuperType函数时,子类型的原型会得到name和colors属性,第二次调用时,子类型对象上又会获得name和colors属性,同时屏蔽掉原型上这两个属性。那么原型上的name和colors属性完全没有必要存在,这就是寄生组合式继承优化的地方
  寄生组合式继承的基本思想:通过借用构造函数来继承属性,通过原型链来继承方法,但是不必为了指定子类型的原型而调用父类的构造函数,我们需要的只是父类型原型的一个索引而已。举例如下:
 function object(o) {
        function F() {
        }

        F.prototype = o;
        return new F();
    }
    //实现继承
    function inherit(subType, superType) {
        var temp = object(superType.prototype);
        temp.constructor = subType;
        subType.prototype = temp;
    }
    //测试用例
    function SuperType(name) {
        this.name = name;
        this.colors = ['red', 'blue'];
    }
    SuperType.prototype.sayName = function () {
        console.log(this.name);
    };
    function SubType(name, age) {
        SuperType.call(this, name);
        this.age = age;
    }
    inherit(SubType, SuperType);
    SubType.prototype.ageAge = function () {
        console.log(this.age);
    }



  更多请参考:
  JavaScript中继承(上)
  JavaScript中继承(中)

猜你喜欢

转载自blog.csdn.net/u013910340/article/details/70832351