【ES6】Proxy

Proxy代理器

Proxy 用于修改某些操作的默认行为,等同于在语言层面做出修改,所以属于一种“元编程”(meta programming),即对编程语言进行编程。

Proxy 可以理解成,在目标对象之前架设一层“拦截”,外界对该对象的访问,都必须先通过这层拦截,因此提供了一种机制,可以对外界的访问进行过滤和改写。

let proxy = new Proxy(target, handler);

target为拦截的目标对象,handler参数也是一个对象,用来定制拦截行为。如果handler没有设置任何拦截,那就等同于直接通向原对象。要使得Proxy起作用,必须针对proxy实例进行操作,而不是针对目标对象进行操作。

一个技巧是将 Proxy 对象,设置到object.proxy属性,从而可以在object对象上调用。

var object = { proxy: new Proxy(target, handler) };

Proxy 实例也可以作为其他对象的原型对象。

var proxy = new Proxy({}, {
  get: function(target, propKey) {
    return 35;
  }
});

let obj = Object.create(proxy);
obj.time // 35

具体方法:

    let proxy = new Proxy(obj, {
      get(target, propKey, receiver) {
        // 参数依次为目标对象,属性名,proxy实例
        if (propKey in target) {
          return target[propKey];
        } else {
          throw new ReferenceError("不存在该属性");
        }
      },
      set(target, property, value, receiver) {
        return value;
      },
      has(target, propKey) {}, // 拦截propKey in proxy
      deleteProperty(target, propKey) {}, // 拦截delete proxy[propkey]
      ownKeys(target) {}, // 拦截器Object.getOwnPropertyNames()、Object.getOwnPropertyDescriptors()、Object.keys(proxy)、for in
      getOwnPropertyDescriptor(target, propKey) {}, // 拦截Object.getOwnPropertyDescriptor(proxy, propKey)
      defineProperty(target, propKey, propDesc) {}, // 拦截Object.defineProperty(proxy, propKey, propDesc)、Object.defineProperties(proxy, propDescs)
      getPrototypeOf(target) {}, // 拦截Object.getPrototypeOf(proxy)
      setPrototypeOf(target, proto) {}, // 拦截Object.setPrototypeOf(proxy, proto)
      preventExtensions(target) {}, // 拦截Object.preventExtensions(proxy)
      isExtensible(target) {}, // 拦截Object.isExtensible(proxy)
      apply(target, object, args){}, // 拦截 Proxy 实例作为函数调用的操作,比如proxy(...args)、proxy.call(object, ...args)、proxy.apply(...)
      construct(target, args){} // 拦截 Proxy 实例作为构造函数调用的操作,比如new proxy(...args)
    });

详细参考:http://es6.ruanyifeng.com/#docs/proxy

 

posted @ 2020-02-09 11:36  把我当做一棵树叭  阅读(134)  评论(0)    收藏  举报