那只能自己new了啊~ 数数js弄到对象的n种方法
种种方法中总能new到一个适合你的~
一 创建对象
萌新们可能张口就来啦
let obj = new Object()
let obj = {}
厉害一点的可能还会用~
let obj = Object.create({})
对没错,这些方法都是可以创建一个新的对象!然而。。。他们都毫无保留的继承了她妈。。也就是Object构造函数所定义好的方法属性。总感觉有点不纯洁~
那么,我想要一个纯净点的对象,然后自行去往里面增加各种东西改怎么操作呢~厉害的同学都可以猜到了,就是~
let obj = Object.create(null)
这样我们就可以得到一个非常非常纯净的新对象!
没有一点杂质~因为Object.create()方法的第一个参数是创建对象他的原型,如果是null,也就是空的话,那么相应的创建的空对象也没有任何原型!没有被任何指染是不是很带劲~这个方法非常适合只需要用对象格式存储特定的数据格式的童鞋~
二 克隆对象
辣么我们在大街上看见一个非常非常棒的对象A怎么办!他/她/它还有复数个相关联的其他对象。。。如果只是
let copy= A
这种横刀夺人的行为可能会引起意料之外的错误,比如。。。被打!(ps,等于就是单纯的引用,copy===A 也就是他们内存地址完全一样,你对obj做任何操作,A也会变)
抽丝剥缕,咱们不能去干这种缺德事儿,想要祂我们就得~~~完完全全的复制一份,这样我们就能得到这个对象所有完完整整的属性方法,但祂的原来的各种复杂关系和我们的新复制的没有任何关系~不怕被打啦~
!深复制和浅复制最根本的区别在于是否是真正获取了一个对象的复制实体,而不是引用!
辣么该怎么偷偷实现呢~(深克隆的方法多种多样,从没人性的转json到es6的新方法,甚至还有lodash的位掩码,我就讲个最最简单的~)
let copy = Object.create(
Object.getPrototypeOf(A),
Object.getOwnPropertyDescriptors(A)
)复制代码
说到这来回顾一下Object.create() 的参数第一个是设置原型,第二个是设置属性,这样就能完完全全的克隆一个对象了~是不是很激动~
然鹅,,,
这还算一个浅拷贝,问题在于在原型的设置上依然是引用,虽然单独的属性可以做到不是引用。
所以。。。深克隆这种事不是交给现成的知名js基础库lodash,或者手写一个复杂还不优雅的递归实现吧~当然还有json转换法等等就不一一列举了
function copy(obj1,obj2){
var obj2=obj2||{}; //最初的时候给它一个初始值=它自己或者是一个json
for(var name in obj1){
if(typeof obj1[name] === "object"){ //先判断一下obj[name]是不是一个对象
obj2[name]= (obj1[name].constructor===Array)?[]:{}; //我们让要复制的对象的name项=数组或者是json
copy(obj1[name],obj2[name]); //然后来无限调用函数自己 递归思想
}else{
obj2[name]=obj1[name]; //如果不是对象,直接等于即可,不会发生引用。
}
}
return obj2; //然后在把复制好的对象给return出去
}复制代码
今天就说这么多!找对象真难!
ps最后一个递归我懒得想直接搬运简书一篇文章的,侵删@https://www.jianshu.com/p/0d7bd31ccf43