手写深拷贝
obj={
a:1,
b:{
c:1
}
}
function deepClone(obj) {
function isObject(o){
return(typeof o ==='object' || typeof o ==='function')&& o!=null
}
if(!isObject(obj)){
throw new Error('非对象')
}
//...浅拷贝
let cloneValue = Array.isArray(obj)?[...obj]:{...obj}
//静态方法 Reflect.ownKeys() 返回一个由目标对象自身的属性键组成的数组。
//Object.keys效果相同,Reflect.ownKeys()返回的属性键有规律:按数字大小排,按序列排
Reflect.ownKeys(obj).forEach(function (key) {
cloneValue[key]=isObject(obj[key])?deepClone(obj[key]):obj[key]
})
return cloneValue
}
let a=deepClone(obj)
{a: 1, b: {…}}a: 1b: {c: 1}__proto__: Object
obj.b.c=2
2
a.b
{c: 1}
a.b.c=3
3
obj.b.c
2
(...spread操作符可以将类数组转成数组,原理是...调用了类数组上的iterator)
原型:

对obj 来说,可以通过 __proto__ 找到一个原型对象,在该对象中定义了很多函数让我们来使用。
Object 是所有对象的爸爸,所有对象都可以通过 __proto__ 找到它
函数的 prototype 是一个对象
对象的 __proto__ 属性指向原型, __proto__ 将对象和原型连接起来组成了原型链