美文网首页
JS的面向对象编程思想3-非构造函数的继承(阮一峰)

JS的面向对象编程思想3-非构造函数的继承(阮一峰)

作者: 人才辈出阿卡姆 | 来源:发表于2017-07-08 16:42 被阅读0次

如何给飞构造函数实现继承??

    var Chinese = {
        nation:'中国'
    };

    var Doctor ={
        career:'医生'
    };

    //1:创建一个方法
    function object(o) {
        function F() {}
        F.prototype = o;
        return new F();
    }
    var Doctor = object(Chinese);
    Doctor.career = '医生';
    console.log(Doctor);
    //实质上还是通过构造函数进行返回 另外还多了一步添加career这个属性给Doctor,因为他被object(Chinese)给重新赋值了

2.浅拷贝 就是利用for in 遍历赋值

    function extendCopy(p){
        var c={};
        for(var i in p){
            c[i]=p[i]
        }
        c.uber= p;
        return c;
    }
    //但是,这样的拷贝有一个问题。那就是,如果父对象的属性等于数组或另一个对象,那么实际上,子对象获得的只是一个内存地址,而不是真正拷贝,因此存在父对          象被篡改的可能。请看,现在给Chinese添加一个"出生地"属性,它的值是一个数组。
    Chinese.birthPlaces = ['北京','上海','香港'];
    var Doctor = extendCopy(Chinese);
    Doctor.birthPlaces.push('厦门');
    console.log(Doctor.birthPlaces); //北京, 上海, 香港, 厦门
    console.log(Chinese.birthPlaces); //北京, 上海, 香港, 厦门
    //这里不做过多的解释,可以看第二遍中的案例说明

3.深拷贝(实现上就是做判断,如果是属性是一个对象或者数组的时候,再进行遍历)

    function deepCopy(c,p){
        var c=c||{};
        for(var i in p){    //开始循环遍历
            if(typeof p[i] ==='object'){ //判断是不是一个对象(数组也是对象类型)
                c[i]=(p[i].constructor === Array)?[]:{};  //使用三元运算:通过constructor找它的构造函数是Object还是Array
                deepCopy(c[i],p[i])   //如果是复杂数据类型 为了防止他内部嵌套的有数组或者对象 再遍历
            }
            else{
                c[i]=p[i]   //遍历到最后不是复杂数据类型了就赋值
            }
        }
        return c
    }

相关文章

网友评论

      本文标题:JS的面向对象编程思想3-非构造函数的继承(阮一峰)

      本文链接:https://www.haomeiwen.com/subject/tncjhxtx.html