`handler.set()` 方法用于拦截设置属性值的操作

## 语法

    var p = new Proxy(target, {
      set: function(target, property, value, receiver) {
      }
    });

### 参数

以下是传递给set方法的参数，`this上下文绑定在`handler对象上.

`target`
  目标对象。
`property`
  被设置的属性名。
`value`
  被设置的新值。
`receiver`
  最初被调用的对象。通常是proxy本身，但handler的set方法也有可能在原型链上或以其他方式被间接地调用（因此不一定是proxy本身）。
  比如，假设有一段代码执行 `obj.name = "jen"，obj不是一个proxy且自身不含name属性，但它的原型链上有一个proxy，那么那个proxy的set拦截函数会被调用，此时obj会作为receiver参数传进来。`

### 返回值

set方法应该返回一个布尔值，返回true代表此次设置属性成功了，如果返回false且设置属性操作发生在严格模式下，那么会抛出一个`TypeError`。

## 描述

`handler.set` 方法用于拦截设置属性值的操作。

### 拦截

该方法会拦截目标对象的以下操作:

- 指定属性值: `proxy[foo] = bar` 和 `proxy.foo = bar`
- 指定继承者的属性值: `Object.create(proxy)[foo] = bar`
- `Reflect.set()`

### 约束

如果违背以下的约束条件，proxy会抛出一个`TypeError`:

- 若目标属性是不可写及不可配置的，则不能改变它的值。
- 如果目标属性没有配置存储方法，即set方法是undefined的，则不能设置它的值。
- 在严格模式下，若set方法返回false，则会抛出一个 `TypeError` 异常。

## 示例

以下代码演示如何捕获属性的设置操作。

    var p = new Proxy({}, {
      set: function(target, prop, value, receiver) {
        console.log("called: " + prop + " = " + value);
        return true;
      }
    });

    p.a = 10; // "called: a = 10"

## 规范

Specification | Status | Comment
--- | --- | ---
ECMAScript 2015 (6th Edition, ECMA-262) [[Set]] | Standard | Initial definition.
ECMAScript Latest Draft (ECMA-262) [[Set]] | Draft |

## 浏览器兼容性

We're converting our compatibility data into a machine-readable JSON format. This compatibility table still uses the old format, because we haven't yet converted the data it contains. Find out how you can help!

- Desktop
- Mobile

Feature | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari
--- | --- | --- | --- | --- | ---
Basic support | ? | 18 (18) | ? | ? | ?

Feature | Android | Chrome for Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile
--- | --- | --- | --- | --- | --- | ---
Basic support | ? | ? | 18.0 (18) | ? | ? | ?

## 另见

- `Proxy`
- `handler`
- `Reflect.set()`