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

2017-12-01  本文已影响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 的不同之处。

上一篇下一篇

猜你喜欢

热点阅读