ES6 笔记之第十五章 Proxy


1. 概述

ES6原生提供Proxy构造函数,用来生成Proxy实例。

var proxy = new Proxy(target, handler);

Proxy 对象的所有用法,都是上边这种形式,不同的是handler参数的写法。new Proxy()表示生成一个Proxy实例,target参数表示所要拦截的目标对象,handler参数也可以是一个对象,用来定制拦截行为。

2. Proxy 实例的方法

2.1 get()

get(target, propKey, receiver):拦截对象属性的读取,比如proxy.foo和proxy[‘foo’]。

三个参数:目标对象、属性名、proxy实例本身(可选)

小栗子:

var person = {
  name: "张三"
};

var proxy = new Proxy(person, {
  get: function(target, propKey) {
    if (propKey in target) {
      return target[propKey];
    } else {
      throw new ReferenceError("Prop name \"" + propKey + "\" does not exist.");
    }
  }
});

proxy.name // "张三"
proxy.age // 抛出一个错误

上述代码,访问目标对象不存在的属性,会抛出一个错误。如果没有拦截函数,访问不存在的属性,只会返回undefined。

2.2 set()

set(target, propKey, value, receiver):拦截对象属性的设置,比如proxy.foo = v或proxy[‘foo’] = v,返回一个布尔值

2.3 apply()

apply(target, object, args):拦截 Proxy 实例作为函数调用的操作,比如proxy(...args)proxy.call(object, ...args)proxy.apply(...)

2.4 has()

has(target, propKey):拦截propKey in proxy的操作,返回一个布尔值

2.5 construct()

construct(target, args):拦截 Proxy 实例作为构造函数调用的操作,比如new proxy(...args)

2.6 deleteProperty()

2.7 defineProperty()

2.8 getOwnPropertyDescriptor()

2.9 getPrototypeOf()

2.10 isExtensible()

2.11 ownKeys()

2.12 preventExtensions()

2.13 setPrototypeOf()

3. Proxy.revocable()

4. this 问题

5. 实例:Web 服务的客户端


文章作者: Xin.Zhao
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Xin.Zhao !
评论
  目录