ES6中的Reflect和Proxy是一种新的API,它们可以用来改变JavaScript语言的行为,改变对象的属性,调用函数,构造对象等等。
Reflect
Reflect是一个内置对象,它提供了操作对象的方法,也可以让操作对象更加容易。它提供了一系列静态方法,用于操作对象,包括:
- Reflect.apply(target, thisArg, args):调用一个函数,接收三个参数:目标函数,this参数,参数数组。
- Reflect.construct(target, args):调用一个构造函数,接收两个参数:目标函数,参数数组。
- Reflect.get(target, name, receiver):获取对象的属性,接收三个参数:目标对象,属性名,接收者对象。
- Reflect.set(target, name, value, receiver):设置对象的属性,接收四个参数:目标对象,属性名,属性值,接收者对象。
- Reflect.defineProperty(target, name, desc):定义对象的属性,接收三个参数:目标对象,属性名,属性描述符。
- Reflect.deleteProperty(target, name):删除对象的属性,接收两个参数:目标对象,属性名。
- Reflect.has(target, name):检查对象是否有指定的属性,接收两个参数:目标对象,属性名。
- Reflect.ownKeys(target):返回对象的所有属性,接收一个参数:目标对象。
使用Reflect可以使代码更加简洁,比如:
// 使用Reflect Reflect.set(person, 'name', 'John'); // 不使用Reflect person.name = 'John';
Proxy
Proxy是一个用于拦截对象操作的对象,它可以拦截对象的属性访问,方法调用,构造函数,以及其他操作。它有两个参数:target(目标对象)和handler(拦截器)。
handler是一个对象,它里面可以定义拦截器函数,拦截器函数有很多,包括:
- get(target, key, receiver):拦截对象属性的读取,接收三个参数:目标对象,属性名,接收者对象。
- set(target, key, value, receiver):拦截对象属性的设置,接收四个参数:目标对象,属性名,属性值,接收者对象。
- apply(target, thisArg, args):拦截函数的调用,接收三个参数:目标函数,this参数,参数数组。
- construct(target, args):拦截构造函数,接收两个参数:目标函数,参数数组。
- deleteProperty(target, key):拦截删除属性,接收两个参数:目标对象,属性名。
- has(target, key):拦截检查属性是否存在,接收两个参数:目标对象,属性名。
使用Proxy可以拦截对象的操作,比如:
// 使用Proxy let proxy = new Proxy(person, { get(target, key) { return target[key] + '!'; } }); // 不使用Proxy let person = { name: 'John' }; let proxy = { get(target, key) { return target[key] + '!'; } }; let proxyPerson = new Proxy(person, proxy);
Reflect和Proxy可以用来改变JavaScript语言的行为,改变对象的属性,调用函数,构