javascript中的三种继承方式及优缺点

1.先看一下对象冒充继承方法(apply/call)

        function people(type){
            this.skill="跑步"
            this.type=type
            this.say=function(){
                return "people的技能是"+this.skill
            }
        }

        function man(type){
            // people.call(this,type)
            people.apply(this,[type])
            this.sex="男"
        }
        var xiaoming=new man("human")
        alert(xiaoming.skill)
        alert(xiaoming.sex)
        alert(xiaoming.type)
        alert(xiaoming.say())

缺点:我们发现man只继承了function定义的属性,并没有继承people的原型属性。

优点:一个子类可以继承多个父类。


2.第二种方法是原型链继承

        function people(){}
        people.prototype.type="男"  
        people.prototype.run=function(){
            return "people的种族是"+this.type
        }

        function man(){}
                                // 将man的原型对象指向people的实例
        man.prototype=new people()//再写一个prototype会覆盖之前的prototype
        man.prototype.name="小明" //写在继承语句之后
        var xiaoming=new man()
        alert(xiaoming.run())

缺点:原型链方法继承了原型属性,但是若改变子类对象的原型,父类对象的原型也会改变。

3.混合模式继承

 (对象冒充继承属性,方法写在父类对象的原型中,子类继承原型)

    function people(name,sex){
        this.name=name
        this.sex=sex
    }
    people.prototype.say=function(){
        return this.name+"的性别是"+this.sex
    }
    // 用对象冒充继承属性
    function man(name,sex){
        people.call(this,name,sex)
    }
    //用原型链继承方法
    man.prototype = new people()
    var xiaoming=new man("小明")
    alert(xiaoming.name)
    alert(xiaoming.say())
弥补了前两种方式的缺陷,目前最好的继承方法。
 

猜你喜欢

转载自blog.csdn.net/tao_gis/article/details/80551292