## 概述

`handler.getPrototypeOf()` 是一个代理方法，当读取代理对象的原型时，该方法就会被调用。

## 语法

    var p = new Proxy(obj, {
      getPrototypeOf(target) {
      ...
      }
    });

### 参数

当 `getPrototypeOf` 方法被调用时，`this` 指向的是它所属的处理器对象。

`target`
  被代理的目标对象。

### 返回值

`getPrototypeOf` 方法必须返回一个对象值或者返回 `null，不能返回其它类型的原始值`。

## 描述

在 JavaScript 中，有下面这五种操作（方法/属性/运算符）可以触发 JS 引擎读取一个对象的原型，也就是可以触发 `getPrototypeOf()` 代理方法的运行：

- `Object.getPrototypeOf()`
- `Reflect.getPrototypeOf()`
- `__proto__`
- `Object.prototype.isPrototypeOf()`
- `instanceof`

如果遇到了下面两种情况，JS 引擎会抛出 `TypeError` 异常：

- `getPrototypeOf()` 方法返回的不是对象也不是 `null。`
- 目标对象是不可扩展的，且 `getPrototypeOf()` 方法返回的原型不是目标对象本身的原型。

## 示例

### 例子：基本用法

    var obj = {};
    var proto = {};
    var handler = {
        getPrototypeOf(target) {
            console.log(target === obj);   // true
            console.log(this === handler); // true
            return proto;
        }
    };

    var p = new Proxy(obj, handler);
    console.log(Object.getPrototypeOf(p) === proto);    // true

### 例子：5 种触发 getPrototypeOf 代理方法的方式

    var obj = {};
    var p = new Proxy(obj, {
        getPrototypeOf(target) {
            return Array.prototype;
        }
    });
    console.log(
        Object.getPrototypeOf(p) === Array.prototype,  // true
        Reflect.getPrototypeOf(p) === Array.prototype, // true
        p.__proto__ === Array.prototype,               // true
        Array.prototype.isPrototypeOf(p),              // true
        p instanceof Array                             // true
    );

### 例子：两种情况下的异常

    var obj = {};
    var p = new Proxy(obj, {
        getPrototypeOf(target) {
            return "foo";
        }
    });
    Object.getPrototypeOf(p); // TypeError: "foo" is not an object or null

    var obj = Object.preventExtensions({});
    var p = new Proxy(obj, {
        getPrototypeOf(target) {
            return {};
        }
    });
    Object.getPrototypeOf(p); // TypeError: expected same prototype value

## 规范

规范名称 | 规范状态 | 备注
--- | --- | ---
ECMAScript 2015 (6th Edition, ECMA-262) [[GetPrototypeOf]] | Standard |

## 浏览器兼容性

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 | 未实现 | 未实现 (bug 888969) | 未实现 | 未实现 | 未实现

Feature | Android | Chrome for Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile
--- | --- | --- | --- | --- | --- | ---
Basic support | 未实现 | 未实现 | 未实现 (bug 888969) | 未实现 | 未实现 | 未实现

## 相关链接

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