`handler.setPrototypeOf()` 方法主要用来拦截 `Object.setPrototypeOf()`.

## 语法

    var p = new Proxy(target, {
      setPrototypeOf: function(target, prototype) {
      }
    });

### 参数

以下参数传递给 `setPrototypeOf` 方法.

`target`
  被拦截目标对象.
`prototype`
  对象新原型或为`null`.

### 返回值

如果成功修改了`[[Prototype]]`, `setPrototypeOf` 方法返回 `true`,否则返回 `false`.

## 描述

这个 `handler.setPrototypeOf` 方法用于拦截 `Object.setPrototypeOf()`.

### 拦截

这个方法可以拦截以下操作:

- `Object.setPrototypeOf()`
- `Reflect.setPrototypeOf()`

### Invariants

如果违反了下列规则，则proxy将抛出一个`TypeError`:

- `如果 target` 不可扩展, 原型参数必须与`Object.getPrototypeOf(target)` 的值相同.

## 示例

如果你不想为你的对象设置一个新的原型，你的handler's的`setPrototypeOf`方法可以返回false，也可以抛出异常。

The former approach means that any operation that performs such mutation, that throws an exception on failure to mutate, will have to create the exception itself. For example, `Object.setPrototypeOf()` will create and throw a `TypeError` itself. If the mutation is performed by an operation that doesn't ordinarily throw in case of failure, such as `Reflect.setPrototypeOf()`, no exception will be thrown.

    var handlerReturnsFalse = {
        setPrototypeOf(target, newProto) {
            return false;
        }
    };

    var newProto = {}, target = {};

    var p1 = new Proxy(target, handlerReturnsFalse);
    Object.setPrototypeOf(p1, newProto); // throws a TypeError
    Reflect.setPrototypeOf(p1, newProto); // returns false

The latter approach will cause any operation that attempts to mutate, to throw. This approach is required if you want even non-throwing operations to throw on failure, or you want to throw a custom exception value.

    var handlerThrows = {
        setPrototypeOf(target, newProto) {
            throw new Error('custom error');
        }
    };

    var newProto = {}, target = {};

    var p2 = new Proxy(target, handlerThrows);
    Object.setPrototypeOf(p2, newProto); // throws new Error("custom error")
    Reflect.setPrototypeOf(p2, newProto); // throws new Error("custom error")

## Specifications

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

## Browser compatibility

The compatibility table on this page is generated from structured data. If you'd like to contribute to the data, please check out https://github.com/mdn/browser-compat-data and send us a pull request.

Update compatibility data on GitHub

| Desktop | Mobile | Server
| Chrome | Edge | Firefox | Internet Explorer | Opera | Safari | Android webview | Chrome for Android | Edge Mobile | Firefox for Android | Opera for Android | Safari on iOS | Samsung Internet | Node.js
`setPrototypeOf` | Chrome ? | Edge ? | Firefox Full support 49 | IE No support No | Opera ? | Safari ? | WebView Android ? | Chrome Android ? | Edge Mobile ? | Firefox Android Full support 49 | Opera Android ? | Safari iOS ? | Samsung Internet Android ? | nodejs Full support 6.0.0

### Legend

Full support
  Full support
No support
  No support
Compatibility unknown
  Compatibility unknown

## See also

- `Proxy`
- `handler`
- `Object.setPrototypeOf()`
- `Reflect.setPrototypeOf()`