handler.getPrototypeOf()

handler.getPrototypeOf() メソッドは [[GetPrototypeOf]] 内部メソッドに対するトラップです。

構文

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

引数

次の引数は getPrototypeOf() メソッドに渡されます。this はハンドラにバインドされます。

target
ターゲットオブジェクトです。

返値

getPrototypeOf() メソッドはオブジェクト、または null を返さなければなりません。

解説

介入

このトラップは下記の操作に介入できます。

不変条件

以下の不変条件に違反している場合、プロキシは TypeError を発生します。

  • getPrototypeOf メソッドはオブジェクト、または null を返さなければなりません。
  • targetが拡張不可の場合、 Object.getPrototypeOf(proxy) メソッドは Object.getPrototypeOf(target) と同じ値を返さなければなりません。

基本的な使い方

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

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

getPrototypeOf トラップが発生する5つの方法

const obj = {};
const 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
);

2種類の例外

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

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

仕様書

仕様書
ECMAScript (ECMA-262)
[[GetPrototypeOf]] の定義

ブラウザーの互換性

Update compatibility data on GitHub
デスクトップモバイルサーバー
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewAndroid 版 ChromeAndroid 版 FirefoxAndroid 版 OperaiOSのSafariSamsung InternetNode.js
getPrototypeOfChrome 完全対応 49Edge 完全対応 79Firefox 完全対応 49IE 未対応 なしOpera 完全対応 36Safari 完全対応 10WebView Android 完全対応 49Chrome Android 完全対応 49Firefox Android 完全対応 49Opera Android 完全対応 36Safari iOS 完全対応 10Samsung Internet Android 完全対応 5.0nodejs 完全対応 6.0.0

凡例

完全対応  
完全対応
未対応  
未対応

関連情報