使用ES6新特性开发微信小程序(6)——元编程
元编程是指的是开发人员对 “语言本身进行编程”。一般是编程语言暴露了一些API供开发人员来操作语言本身的某些特性。
Proxy是ES6加入的一个新特性它可以 “代理” 对象的原生行为替换为执行自定义行为。
Proxy可以理解成在目标对象之前架设一层“拦截”外界对该对象的访问都必须先通过这层拦截因此提供了一种机制可以对外界的访问进行过滤和改写。Proxy这个词的原意是代理用在这里表示由它来“代理”某些操作可以译为“代理器”。
创建一个Proxy对象:
元编程是指的是开发人员对 “语言本身进行编程”。一般是编程语言暴露了一些API供开发人员来操作语言本身的某些特性。
从ES6开始新增了Proxy和 Reflect特性扩展了元编程(Meta Programming)能力允许拦截并定制基础语言操作行为(比如属性查找赋值枚举函数调等)。
Proxy(代理)
Proxy是ES6加入的一个新特性它可以 “代理” 对象的原生行为替换为执行自定义行为。
Proxy可以理解成在目标对象之前架设一层“拦截”外界对该对象的访问都必须先通过这层拦截因此提供了一种机制可以对外界的访问进行过滤和改写。Proxy这个词的原意是代理用在这里表示由它来“代理”某些操作可以译为“代理器”。
Proxy 对象用来为基础操作(例如:属性查找、赋值、枚举、方法调用等)定义用户自定义行为。
创建一个Proxy对象:
target:目标对象可以是任意类型的对象比如数组函数甚至是另外一个代理对象。
handlert:处理器对象包含了一组代理方法分别控制所生成代理对象的各种行为。
Proxy对象的方法:
Proxy.revocable(target, handler):用来创建一个可撤销的代理对象。
处理器对象一共有14种可代理方法:
handler.getPrototypeOf():在读取代理对象的原型时触发该操作比如在执行 Object.getPrototypeOf(proxy) 时。
handler.setPrototypeOf():在设置代理对象的原型时触发该操作比如在执行 Object.setPrototypeOf(proxy, null) 时。
handler.isExtensible():在判断一个代理对象是否是可扩展时触发该操作比如在执行 Object.isExtensible(proxy) 时。
handler.preventExtensions():在让一个代理对象不可扩展时触发该操作比如在执行 Object.preventExtensions(proxy) 时。
handler.getOwnPropertyDescriptor():在获取代理对象某个属性的属性描述时触发该操作比如在执行 Object.getOwnPropertyDescriptor(proxy, “foo”) 时。
handler.defineProperty():在定义代理对象某个属性时的属性描述时触发该操作比如在执行 Object.defineProperty(proxy, “foo”, {}) 时。
handler.has():在判断代理对象是否拥有某个属性时触发该操作比如在执行 “foo” in proxy 时。
handler.get():在读取代理对象的某个属性时触发该操作比如在执行 proxy.foo 时。
handler.set():在给代理对象的某个属性赋值时触发该操作比如在执行 proxy.foo = 1 时。
handler.deleteProperty():在删除代理对象的某个属性时触发该操作比如在执行 delete proxy.foo 时。
handler.enumerate():在遍历代理对象的属性时触发该操作比如在执行 for(i in proxy){} 时。
handler.ownKeys():在获取代理对象的所有属性键时触发该操作比如在执行 Object.getOwnPropertyNames(proxy) 时。
handler.apply():在调用一个目标对象为函数的代理对象时触发该操作比如在执行 proxy() 时。
handler.construct():在给一个目标对象为构造函数的代理对象构造实例时触发该操作比如在执行new proxy() 时。
let handler1 = {
get: function(target, name) {
return name in target ? target[name] : 42;
}
};
let proxy1 = new Proxy({}, handler1);
proxy1.a = 1;