-
不是引用对象: string,number,boolean,undefined,null
-
引用关系,对象,function,HTMLElement(元素创建)
思路:
-
如果target不存在,返回一个空对象
-
如果存在,获取所有的属性名
-
遍历属性名
-
获取描述对象
-
判断值的类型:如果为对象或者不为null判断是什么类型
-
日期型
-
正则型
-
HTML元素型
-
函数型(之后补充)
-
-
定义对象的属性
-
可读性
-
不可删除性
-
不可枚举型
-
值
-
-
复制对象
- 递归调用,把desc.value复制到obj
function cloneObj(source,target){//把源对象复制到目标对象中
if(target==undefined) target={};//target不存在,返回空对象
var names=Object.getOwnPropertyNames(source);//获取所有属性名(广度当前层)
for(var i=0;i<names.length;i++){//不能使用for in,因为不可枚举
var desc=Object.getOwnPropertyDescriptor(source,names[i]);//获取描述对象
if(typeof desc.value==="object" && desc.value!==null){
var obj;
switch(true){
case desc.value.constructor===Date:
obj=new Date(desc.value.toString());//日期型
break;
case desc.value.constructor===RegExp://正则型
obj=new RegExp(desc.value.source,desc.value.flags);
break;
case HTMLElement.isPrototypeOf(desc.value.constructor):
obj=document.createElement(desc.value.nodeName);
break;
default:
obj=new desc.value.constructor()
}
Object.defineProperty(target,names[i],{
enumerable:desc.enumerable,//不可枚举
writable:desc.writable,//可写型
configurable:desc.configurable,//不可删除性
value:obj
});
cloneObj(desc.value,obj);//递归调用,把desc.value复制到obj
}else{
Object.defineProperty(target,names[i],desc)
}
}
return target;
}