美文网首页
JS的深复制以及instanceof和原型链

JS的深复制以及instanceof和原型链

作者: 姚舒杨 | 来源:发表于2017-12-01 19:11 被阅读0次

    看看new关键字干了什么

    var p={};
    
    p.__proto__=Person.prototype;
    
    Person.call(p);
    

    然后,看看继承都干了什么东西咯。
    首先是继承的一般写法。

    function Step1(){
    
    }
    Step1.prototype.a=100;
    function Step2(){
    
    }
    Step2.prototype=new Step1()
    Step2.prototype.b=200;
    function Step3(){
    
    }
    Step3.prototype=new Step2();
    let a=new Step3();
    

    这个应该很容易看懂。
    结合上面所说的new的过程。
    a的 __proto__ 是 Step3的prototype ,Step3的prototype则是Step2的实例。Step2的实例的__proto__ 则是Step2的 prototype,Step2的protype是Step1的实例并且加上了一个b属性,而Step1的实例的__proto__则是Step1的prototype。
    于是说是这样的。

    a.__proto__=Step3.prototype;
    a.__proto__.__proto__=Step2.prototype;
    a.__proto__.__proto__.__proto__=Step1.prototype;
    

    这个就是原型链了。

    说说instanceof 都做了什么

    function instance_of(L, R) {//L 表示左表达式,R 表示右表达式
     var O = R.prototype;// 取 R 的显示原型
     L = L.__proto__;// 取 L 的隐式原型
     while (true) { 
       if (L === null) 
         return false; //表示原型链到达最后了,Object.__proto__.__proto__===null
       if (O === L)// 这里重点:当 O 严格等于 L 时,返回 true 
         return true; 
       L = L.__proto__; 
     } 
    }
    

    说的很明白了,instanceof就是不断往后看看有没有原型和右边一样的。

    function deepCopy(obj){
        let copy = {};
        if (typeof obj === 'object'){
            if(obj instanceof Array){
                let lengthOfArray=obj.length;
                let copideArray=[];
                for(let i=0;i<=lengthOfArray-1;i++){
                    let item = obj[i];
                    if(item instanceof Array){
                        item = deepCopy(item);
                    }
                    else if(item instanceof Object){
                        item = deepCopy(item);
                    }
                    copideArray.push(item);
                }
                copy=copideArray;
            }
            else if(obj === null){
                copy=null;
            }
            else{
                for (each in obj){
                    let valueOfeach=obj[each];
                    if (valueOfeach instanceof Array){
                        let subObj = deepCopy(valueOfeach);
                        copy[each]=subObj;
                    }
                    else if(typeof valueOfeach === 'object'){
                        let subObj = deepCopy(valueOfeach);
                        copy[each]=subObj;
                    }
                    else{
                        copy[each]=valueOfeach;
                    }
                }
            }
        }
        else{
            copy=obj;
        }
          return copy;
        }
    

    当然,上面的东西也是会出很多问题的比如arraybuffer 和 其他的类似array的对象。
    代码很简单。但是却让我知道了typeof 和 instanceof 的不同之处。

    相关文章

      网友评论

          本文标题:JS的深复制以及instanceof和原型链

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