让前端飞前端学习

前端 | JS | 面试中不得不知道的JS 继承的五种方式

2019-02-26  本文已影响2人  彬彬有李学数据

目录:

JS中继承的概念
为什么要使用继承?
继承的第一种方式:原型链继承1
继承的第二种方式:原型链继承2
继承的第三种方式:拷贝继承
继承的第四种方式:原型式继承
继承的第五种方式:借用构造函数实现继承

JS中继承的概念:

为什么要使用继承?

    function Person(){
        this.say=function(){
            console.log("你好")
        }
    }
    var p1=new Person();
    var p2=new Person();
    console.log(p1.say === p2.say);   //false

继承的第一种方式:原型链继承1

    Person.prototype.say=function(){
        console.log("你好")
    }

继承的第二种方式:原型链继承2

    Person.prototype = {
        //切记不能忘记 constructor指向当前函数本身
        constructor:Person,
        say:function(){
            console.log("你好");
        },
        run:function(){
            console.log("正在进行百米冲刺");
        }
    }

继承的第三种方式:拷贝继承(混入继承:mixin)


    var o1={ age:2 }
    var o2 = o1;
    o2.age=18;      
    //1、修改了o2对象的age属性
    //2、由于o2对象跟o1对象是同一个对象
    //3、所以此时o1对象的age属性也被修改了
    var o3={gender:"男",grade:"初三",group:"第五组",name:"张三"};
    var o4={gender:"男",grade:"初三",group:"第五组",name:"李四"};
    //上述代码中,如果使用拷贝继承对代码进行优化会非常和谐

    //实现拷贝继承:
    //1、已经拥有了o3对象
    //2、创建一个o3对象的拷贝(克隆):for...in循环
    //3、修改克隆对象,把该对象的name属性改为"李四"
    
    
    //1、已经拥有了o3对象
    var o3={gender:"男",grade:"初三",group:"第五组",name:"张三"};
    //2、创建一个o3对象的拷贝(克隆):for...in循环
    var o4={};
        //a、取出o3对象中的每一个属性
    for (var key in o3) {
                //key就是o3对象中的每一个属性
        //b、获取到对应的属性值
        var value = o3[key];
        //c、把属性值放到o4中
        o4[key] = value;
    }

    //3、修改克隆对象,把该对象的name属性改为"李四"
    o4.name="李四"
    console.log(o4);    //最终的目标对象的结果
    
    var source={name:"李白",age:15}
    var target={};
    target.name=source.name
    target.age=source.age;
    function extend(target,source){
        for(key in source){
            target[key]=source[key];
        }
        return target;
    }
    extend(target,source)
    var source={name:"李白",age:15}
    //让target是一个新对象,同时拥有了name、age属性
    var target={ ...source }
    
    var target2={ ...source,age:18 }

继承的第四种方式:原型式继承:(道格拉斯在蝴蝶书中提出来的)(最近用不到,但是后期会发现它的好处,追求代码简洁和性能极致)

继承的第五种方式:借用构造函数实现继承

function Animal(name,age,gender){
    this.name=name;
    this.age=age;
    this.gender=gender;
}
function Person(name,age,gender,say){
    this.name=name;
    this.age=age;
    this.gender=gender;

    this.say=function(){

    }
}
function Animal(name,age){
    this.name=name;
    this.age=age;
}
function Person(name,age,address){
    Animal.call(this,name);
    //this.name=name;
    //this.age=age;
    this.address=address;
}
上一篇下一篇

猜你喜欢

热点阅读