继续分享在 javascript 中是如何实现元编程,我们先介绍一下在 js 中的代理以及代理模式是什么,Proxy 从名字上看显而易见,就是对真实对象进行代理,为了是隐藏真实对象,且提供统一接口。大家记住这个就行,以后在设计模式中会为大家详细讲解,在元编程中的代理的目的是—提供统一接口。
第一参数为要代理的对象,通过 new 创建的 proxy 对象是代理什么对象或类型,可以代理以下类型的对象,提醒他们都是 object 类型。
代理创建对象与其代理对象类型保持一致。
这里处理函数,其实就是复写一些对象一些基本方法,代理也就是在原有对象上再套上一层,为其原有的方法添加新特性。
有关 handler(处理方法)是通过代码给大家解释一下,我们通过 hanlder 复写对象原有的 get 方法,如果属性在对象中不存,我们在获取时就会返回 37 ,代码很简单也很明了,就不进行过多解释了,也便于大家理解 handler 的用途。
这是代理可以复写的方法,在元编程中的代理一般不单独使用,他会与下面介绍的 Reflect 对象一起共同完成对元编程的实现。所以他们俩的方法也是一一对应的。因为代理一个对象后,我们复写了原有方法,还需要用 Reflect 来调用原有的方法。
介绍 Reflect API
Reflect 不是构造函数, 要使用的时候,直接通过 Reflect.method() 来调用, Reflect 有的方法和 Proxy 差不多, 而且多数 Reflect 方法原生的 Object 已经重新实现了。
*这里给大家提一下 revoke 方法,如果执行这个 revoke 方法就会销毁对象属性。
实战以动态校验为例来进行讲解。
来看一看,动态校验是如何实现的,在运行时当我们为对象赋值时,进行动态地校验,代码很清晰,估计大家一看就明白逻辑,这也就是会说话的代码。
这里如果有传入 validations 回调函数,就使用传入的回调函数,如果没有就用默认 ()=>true。validations 是一个校验对象,根据传入 key 来调用对应的校验方法。