ES6代理模式实现对象深复制
总体介绍:
对于对象深复制,要实现高性能的话,需要减少必要的时间和空间花费,那么代理模式是如何在时间和空间上进行减少开支的呢?
- 共享读:复制的对象的数据在没有修改之前,读取复制后的对象的值就会把读请求重定向到被复制的对象上面去,只有当数据被修改后,才会从缓存中进行读取。
- 懒代理:在初始化的时候,不会进行全部代理,而是在访问的时候进行代理,这样就使得
cpu
的压力分配到不同阶段去,就不会产生很大的开销。
实现思路:
- 需要存储关系的数据结构:
rawToProxyMap
:原生对象对应的代理对象的Map
,记录所有的原生对象的代理对象,减少代理次数。copyCacheMap
:重新赋值后的数据缓存,如果一个代理对象进行重新赋值后,会把数据存储在这里,按照Object->Data
进行存储,
- 对于
getter
代理:- 如果是对象类型的数据,则返回其代理对象,所以用户永远拿到代理对象
- 如果是基本数据类型,则直接获取基本数据类型。
- 对于
setter
:- 在进行赋值的时候,需要将数据存放到
copyCacheMap
中,以便下一次访问的时候进行获取,而不是对原始数据进行修改。 - 新值如果是一个对象的话,那么直接把其设置成代理对象。这是进行懒代理的关键步骤。
- 在进行赋值的时候,需要将数据存放到
代码实现
const isArray = array => Array.isArray(array);
const toString = tar => Object.prototype.toString.call(tar);
const sliceType = str => String.prototype.slice.call(str, 8, -1);
const isObject