怎么把一个对象当做数组使用

网站建设4年前发布
55 0 0

20230306100516f61d9d7138f5fedd1ca6693e6aa1eed5f08793850,我们知道在JS中对象和数组的操作方式是不一样的,但是我们可以通过封装,给对象加一层包装器,让它可以和数组拥有同样的使用方式。我们主要借助Object.keys()Object.values()Object.entries()Proxy。,看一下MDN上的解释:,也就是Object.keys可以获取对象的所有属性名,并生成一个数组。,看一下MDN上的解释:,Object.values()返回一个数组,元素是对象上找到的可枚举属性值。,看一下MDN上的解释:,Object.entries()返回一个数组,元素是由属性名和属性值组成的数组。,Proxy是JS最新的对象代理方式,用于创建一个对象的代理,从而实现基本操作的拦截和自定义(如属性查找、赋值、枚举、函数调用等)。,使用Proxy可以封装对象的原始操作,在执行对象操作的时候,会经过Proxy的处理,这样我们就可以实现数组操作命令。,以上示例的中,当对象中不存在属性名时,默认返回值为37。,使用Proxy包装原生对象生成一个代理对象p,对代理对象的操作会转发到原生对象上。,我们要实现以下几个函数:forEachmapfilterreduceslicefindfindKeyincludeskeyOflastKeyOf。,数组中的forEach函数定义:arr.forEach(callback(currentValue [, index [, array]])[, thisArg])。,数组中的forEach需要传入一个函数,函数的第一个参数是当前操作的元素值,第二个参数是当前操作的元素索引,第三个参数是正在操作的对象。,对于对象,我们将参数定为:currentValue、key、target。我们可以使用Object.keys来遍历对象。,这里需要targetcallback参数,我们通过函数封装一下。,这样我们就可以使用以下方式调用:,通过Proxy封装:,以上方式当然是不行的,我们主要看最后一句,其执行方式和数组的forEach完全相同,我们在调用Proxy封装的对象时,获取数据时,会调用get函数,第一个参数为原生对象,第二个参数为属性名-forEach,在这里就要修改我们的forEach函数了。首先p.forEach的参数是一个函数,因此我们代理对象的返回值需要接收一个函数作为参数,因此修改如下:,因此完成代码为:,我们应该把以上代码封装为模块,方便对外使用:,以上是forEach的实现和封装,其他函数的实现方式类似。,全部源码如下:

© 版权声明

相关文章