Object.assign 实现原理与分析

Object.assign剖析与深拷贝

Object.assign剖析:

 

方法含义:

浅层次的完成对象的拷贝工作,拷贝源对象的第一层属性和第一层引用

方法使用

Object(目标对象,源对象1,源对象2,…)

方法原理

步骤:1.判断对象是否存在assign方法,没有就直接赋值给对象一个assign方法

2.判断目标源对象是否为空,为空则抛出错误,程序完毕

3.遍历源对象,拿出可枚举属性赋值给新对象

4.返回新对象

 

代码实现

 if (typeof Object.assign !== 'function') {

 

      (function () {

        Object.assign = function (target, ...rest) {

          let target = {}

          if (target == undefined || target == null) {

            throw new Error('目标对象不可以为空'target)

          }

          rest.forEach((ele=> {

            for (let key in ele) {

              if (Object.hasOwnProperty(elekey)) {

                target[key= ele[key]  // 遍历可枚举属性

              }

            }

          })return target

        }

      })()

 

}

 

扩展部分

 

可枚举属性:能够被for in ,Object.getOwnDescriptor, Object.getOwnDescriptors,Object.key能够遍历,循环出的属性,可以通过描述符中的enumerable设置为true进行配置.

 

Assign:只能进行浅拷贝,只能拷贝第一层的属性和引用。拷贝的引用会跟着目标地址的改变而改变

 

深拷贝:通过创建不同的内存地址环境形成引用转而形成新的对象

 

深拷贝的实现方法:

 

  1. 通过JSON形成 JSON.parse(JSON.Stringyfy(obj))

缺点:无法深层次复制关于有关操作符描述后的属性,比如设置了get,set的属性,只能序列化第一次的值,但是get函数消失

 

  1. 通过Object.defineProperties,Object.getOwnPropertyDescriptors,实现深度拷贝
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值