js继承之组合继承

组合继承,指的是将原型链和借用构造函数的技术组合在一块,从而发挥二者之长的一种继承模式。

红宝书是这样说的,其思路是使用原型链实现对原型属性和方法的继承,通过借用构造函数来实现对实例属性的继承,这样,即通过在原型上定义方法实现了函数复用,又能保证每个实例都有自己的属性。

下面我们看一个组合继承的例子,没有女朋友我们就new一个女朋友

       function Friend(name,age){  //构造函数
            this.name = name;
            this.age = age;
        }
        Friend.prototype.showName=function(){
            console.log(this.name);
        }


        //继承 如果我们想把被传入的函数对象里this的指针指向外部字面量定义的对象,那么我们就是用apply和call
        function GirlFriend(name,age){
           // 继承属性
            Friend.call(this,name,age);
            this.city = "青岛";
        }
        // 继承方法
        GirlFriend.prototype = new Friend();  //此时 GirlFriend.prototype 中的 constructor 被重写了,会导致 GirlFriend.prototype.constructor === Friend
        GirlFriend.prototype.constructor = GirlFriend;   //需要修复构造函数指向的。

        GirlFriend.prototype.showCity=function(){
            console.log(this.city);
        }

        var friend = new Friend("韩商言",26);
        var girlFriend = new GirlFriend("佟年",25);
        friend.showName();  // 韩商言
        girlFriend.showName();  // 佟年
        girlFriend.showCity();  // 青岛
        console.log(girlFriend.name);  // 佟年
        console.log(girlFriend.city); // 青岛

组合继承避免了原型链和借用构造函数的缺陷,融合了他们的优点,So,组合继承成为了JavaScript中最常用的继承模式。

你可能感兴趣的:(js继承之组合继承)