Lodash:工作中用的
npm i Lodash
class Box{
constructor(){
this.a=10;
}
play(){
}
}
var div=document.createElement("div");
var obj={a:1,b:2};
Object.defineProperties(obj,{
c:{
value:3
},
d:{
writable:true,
value:4
},
e:{
enumerable:true,
value:{a:1}
},
f:{
enumerable:true,
value:function(){
console.log("aaa");
}
},
g:{
enumerable:true,
configurable:true,
writable:true,
value:div
}
});
Object.defineProperties(obj.e,{
b:{
value:new Date()
},
c:{
writable:true,
value:[1,2,3,4]
},
d:{
value:{
a:1
}
},
e:{
value:{
a:10
}
}
})
Object.defineProperties(obj.e.d,{
b:{
value:new Box()
},
c:{
value:/[a-z].*?/g,
configurable:true
}
})
/* console.log(obj);
// 获取对象下所有属性名和方法名,返回这个名称组成的数组
var names=Object.getOwnPropertyNames(obj);
// 获取对象下某个属性的描述对象
var desc=Object.getOwnPropertyDescriptor(obj,"e");
var obj1=JSON.parse(JSON.stringify(obj));
// JSON不能转换不可遍历属性,因此也不能所有内容复制
console.log(obj1); */
console.log(obj);
var obj1={};
obj1=cloneObject(obj1,obj);
console.log(obj1);
function cloneObject(target,source){
// 获取源对象的所有属性名数组
var names=Object.getOwnPropertyNames(source);
for(var i=0;i<names.length;i++){
// 遍历属性名数组,获取每个属性名的描述属性对象
// 如果描述对象的value是对象类型,他有引用并且非空,这种情况就需要对它的子对象进行复制
var desc=Object.getOwnPropertyDescriptor(source,names[i]);
if(typeof desc.value==="object" && desc.value!==null){
// 执行函数cloneObject,填入第一个参数,源对象,目标对象为空
var obj;
if(desc.value.constructor===RegExp){
obj=new RegExp(desc.value.source,desc.value.flags);
}else if(desc.value.nodeName){
obj=document.createElement(desc.value.nodeName);
}else{
obj=new desc.value.constructor();
}
Object.defineProperty(target,names[i],{
writable:desc.writable,
configurable:desc.configurable,
enumerable:desc.enumerable,
value:obj
});
cloneObject(obj,desc.value)
}else{
// 如果该对象属性的描述对象的value是非引用值,直接给目标对象增加这个属性名,
// 并且将这个对象的描述对象赋值给这个新的属性
Object.defineProperty(target,names[i],desc);
}
}
return target;
}
正则的复制
14班的写法: