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 的不同之处。