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]] の定義
ドラフト  

ブラウザ実装状況

 

機能ChromeEdgeFirefoxInternet ExplorerOperaSafari
基本対応 なし なし49 なし なし なし
機能Android webviewChrome for AndroidEdge mobileFirefox for AndroidOpera AndroidiOS SafariSamsung Internet
基本対応 なし なし なし49 なし なし なし

関連情報

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

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