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

構文

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

引数

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

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

戻り値

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

説明

インターセプト

このトラップを下記の操作をインターセプトできます。:

不変条件

次の不変条件に違反している場合、プロキシは TypeError をスローします。:

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

基本的な使い方

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

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

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
);

2種類の例外

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]] の定義
標準 初期定義
ECMAScript Latest Draft (ECMA-262)
[[GetPrototypeOf]] の定義
ドラフト  

ブラウザ実装状況

 

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

凡例

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

関連情報

ドキュメントのタグと貢献者

このページの貢献者: segayuu, SphinxKnight, shide55
最終更新者: segayuu,