Object.assign 实现原理

Object.assign

方法说明

Object.assign()用于将对象自身所有的可枚举属性从一个或者多个源对象上复制到目标对象

源码的关键点在于

该方法的原理比较简单,实现的关键点在于理解 ”方法说明“ 中的内容,对照下面的源码内容和注释,即可理解和实现

源码

Object.myAssign = function (target, ...src) {
  for (let i = 0; i < src.length; i++) {
    if (src[i] !== null || src[i] !== undefined) {
      // 过滤掉源对象为null和undefined的情况
      for (let key in src[i]) {
        // in运算符会查找原型对象上的可枚举属性,所以需要通过Object.prototype.hasOwnProperty方法过滤掉对象原型对象上的属性
        if (src[i].hasOwnProperty(key)) {
          target[key] = src[i][key]
        }
      } 
    }
  }
  return target
}

// 示例代码
const proto = { p: 'proto' }
const obj1 = { a: 'aa' }
const obj2 = { b: 'bb' }
// 以proto对象为新对象的__proto__
const obj3 = Object.create(proto, {
  c: {
    value: 'cc',
    enumerable: true
  }
})
console.log(obj3)  // {c: 'cc'}
// 输出obj3的构造函数的原型对象
console.log(obj3.__proto__)  // {p: 'proto'}
const t1 = Object.myAssign({}, obj1, obj2)
console.log(t1)  // {a: "aa", b: "bb"}
const t2 = Object.myAssign({}, obj1, null, obj2, undefined)
console.log(t2)  // {a: "aa", b: "bb"}
const t3 = Object.myAssign({}, obj1, obj2, obj3)
console.log(t3)  // {a: "aa", b: "bb", c: "cc"}

你可能感兴趣的:(javascript)