1
0
mirror of https://github.com/ruanyf/es6tutorial.git synced 2025-05-25 03:02:21 +00:00

edit Reflect

This commit is contained in:
ruanyf 2015-12-16 10:14:57 +08:00
parent c3f4ad4421
commit b7a766f54b

View File

@ -769,19 +769,44 @@ revoke();
proxy.foo // TypeError: Revoked proxy.foo // TypeError: Revoked
``` ```
Proxy.revocable方法返回一个对象该对象的proxy属性是Proxy实例revoke属性是一个函数可以取消Proxy实例。上面代码中当执行revoke函数之后再访问Proxy实例就会抛出一个错误。 `Proxy.revocable`方法返回一个对象,该对象的`proxy`属性是`Proxy`实例,`revoke`属性是一个函数,可以取消`Proxy`实例。上面代码中,当执行`revoke`函数之后,再访问`Proxy`实例,就会抛出一个错误。
## Reflect概述 ## Reflect概述
Reflect对象与Proxy对象一样也是ES6为了操作对象而提供的新API。Reflect对象的设计目的有这样几个。 `Reflect`对象与`Proxy`对象一样也是ES6为了操作对象而提供的新API。`Reflect`对象的设计目的有这样几个。
1Object对象的一些明显属于语言层面的方法放到Reflect对象上。现阶段某些方法同时在Object和Reflect对象上部署未来的新方法将只部署在Reflect对象上。 1`Object`对象的一些明显属于语言内部的方法(比如`Object.defineProperty`),放到`Reflect`对象上。现阶段,某些方法同时在`Object``Reflect`对象上部署,未来的新方法将只部署在`Reflect`对象上。
2 修改某些Object方法的返回结果让其变得更合理。比如`Object.defineProperty(obj, name, desc)`在无法定义属性时,会抛出一个错误,而`Reflect.defineProperty(obj, name, desc)`则会返回false。 2 修改某些Object方法的返回结果让其变得更合理。比如`Object.defineProperty(obj, name, desc)`在无法定义属性时,会抛出一个错误,而`Reflect.defineProperty(obj, name, desc)`则会返回`false`
3 让Object操作都变成函数行为。某些Object操作是命令式比如`name in obj``delete obj[name]`,而`Reflect.has(obj, name)``Reflect.deleteProperty(obj, name)`让它们变成了函数行为。 ```javascript
// 老写法
try {
Object.defineProperty(target, property, attributes);
// success
} catch (e) {
// failure
}
4Reflect对象的方法与Proxy对象的方法一一对应只要是Proxy对象的方法就能在Reflect对象上找到对应的方法。这就让Proxy对象可以方便地调用对应的Reflect方法完成默认行为作为修改行为的基础。也就是说不管Proxy怎么修改默认行为你总可以在Reflect上获取默认行为。 // 新写法
if (Reflect.defineProperty(target, property, attributes)) {
// success
} else {
// failure
}
```
3`Object`操作都变成函数行为。某些`Object`操作是命令式,比如`name in obj``delete obj[name]`,而`Reflect.has(obj, name)``Reflect.deleteProperty(obj, name)`让它们变成了函数行为。
```javascript
// 老写法
'assign' in Object // true
// 新写法
Reflect.has(Object, 'assign') // true
```
4`Reflect`对象的方法与`Proxy`对象的方法一一对应,只要是`Proxy`对象的方法,就能在`Reflect`对象上找到对应的方法。这就让`Proxy`对象可以方便地调用对应的`Reflect`方法,完成默认行为,作为修改行为的基础。也就是说,不管`Proxy`怎么修改默认行为,你总可以在`Reflect`上获取默认行为。
```javascript ```javascript
Proxy(target, { Proxy(target, {
@ -795,7 +820,7 @@ Proxy(target, {
}); });
``` ```
上面代码中Proxy方法拦截target对象的属性赋值行为。它采用`Reflect.set`方法将值赋值给对象的属性,然后再部署额外的功能。 上面代码中,`Proxy`方法拦截`target`对象的属性赋值行为。它采用`Reflect.set`方法将值赋值给对象的属性,然后再部署额外的功能。
下面是另一个例子。 下面是另一个例子。
@ -816,11 +841,21 @@ var loggedObj = new Proxy(obj, {
}); });
``` ```
上面代码中每一个Proxy对象的拦截操作`get``delete``has`内部都调用对应的Reflect方法保证原生行为能够正常执行。添加的工作就是将每一个操作输出一行日志。 上面代码中,每一个`Proxy`对象的拦截操作(`get``delete``has`内部都调用对应的Reflect方法保证原生行为能够正常执行。添加的工作就是将每一个操作输出一行日志。
有了`Reflect`对象以后,很多操作会更易读。
```javascript
// 老写法
Function.prototype.apply.call(Math.floor, undefined, [1.75]) // 1
// 新写法
Reflect.apply(Math.floor, undefined, [1.75]) // 1
```
## Reflect对象的方法 ## Reflect对象的方法
Reflect对象的方法清单如下共14个。 `Reflect`对象的方法清单如下共14个。
- Reflect.apply(target,thisArg,args) - Reflect.apply(target,thisArg,args)
- Reflect.construct(target,args) - Reflect.construct(target,args)
@ -839,11 +874,11 @@ Reflect对象的方法清单如下共14个。
上面这些方法的作用,大部分与`Object`对象的同名方法的作用都是相同的,而且它与`Proxy`对象的方法是一一对应的。下面是对其中几个方法的解释。 上面这些方法的作用,大部分与`Object`对象的同名方法的作用都是相同的,而且它与`Proxy`对象的方法是一一对应的。下面是对其中几个方法的解释。
**1Reflect.get(target,name,receiver)** **1Reflect.get(target, name, receiver)**
查找并返回target对象的name属性如果没有该属性则返回undefined。 查找并返回`target`对象的`name`属性,如果没有该属性,则返回`undefined`
如果name属性部署了读取函数则读取函数的this绑定receiver。 如果`name`属性部署了读取函数则读取函数的this绑定`receiver`
```javascript ```javascript
var obj = { var obj = {
@ -858,7 +893,7 @@ Reflect.get(obj, "foo", wrapper);
**2Reflect.set(target, name, value, receiver)** **2Reflect.set(target, name, value, receiver)**
设置target对象的name属性等于value。如果name属性设置了赋值函数则赋值函数的this绑定receiver。 设置`target`对象的`name`属性等于`value`。如果`name`属性设置了赋值函数,则赋值函数的`this`绑定`receiver`
**3Reflect.has(obj, name)** **3Reflect.has(obj, name)**