js温习回顾(二)

182 阅读1分钟

手写深拷贝

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__ 将对象和原型连接起来组成了原型链