handler.defineProperty()Object.defineProperty() に対するトラップです。

構文

var p = new Proxy(target, {
  defineProperty: function(target, property, descriptor) {
  }
});

引数

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

target
ターゲットオブジェクトです。
property
ディスクリプタを取得されるプロパティ名です。
descriptor
定義や変更されるプロパティに対するディスクリプタです。

戻り値

defineProperty メソッドはプロパティが正しく定義されたかどうかを表す boolean を返す必要があります。

説明

handler.defineProperty() メソッドは Object.defineProperty() に対するトラップです。

インターセプト

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

不変条件

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

  • ターゲットオブジェクトが拡張不可の場合、プロパティは追加できません。
  • ターゲットオブジェクトの設定不可の独自のプロパティとして存在しない場合、プロパティは設定不可とみなされ、追加や変更ができません。
  • ターゲットオブジェクトの対応する設定可能なプロパティが存在する場合、プロパティは設定不可にすることができません。
  • 対応するターゲットオブジェクトのプロパティが存在する場合、Object.defineProperty(target, prop, descriptor) は例外をスローしません。
  • strict モードでは、defineProperty ハンドラから false が返ってきた場合、TypeError 例外をスローします。

次のコードはObject.defineProperty()をトラップします。

var p = new Proxy({}, {
  defineProperty: function(target, prop, descriptor) {
    console.log("called: " + prop);
    return true;
  }
});

var desc = { configurable: true, enumerable: true, value: 10 };
Object.defineProperty(p, 'a', desc); // "called: a"

{jsxref("Object.defineProperty()")}} または Reflect.defineProperty() を呼んだ時、 defineProperty トラップに渡されるディスクリプタは制約があります。下記のプロパティのみが使用可能で、標準ではないプロパティは無視されます。

  • enumerable
  • configurable
  • writable
  • value
  • get
  • set
var p = new Proxy({}, {
  defineProperty(target, prop, descriptor) {
    console.log(descriptor);
    return Reflect.defineProperty(target, prop, descriptor);
  }
});

Object.defineProperty(p, 'name', {
  value: 'proxy',
  type: 'custom'
});  // { value: 'proxy' }

仕様

仕様 ステータス コメント
ECMAScript 2015 (6th Edition, ECMA-262)
[[DefineOwnProperty]] の定義
標準 初期定義
ECMAScript Latest Draft (ECMA-262)
[[DefineOwnProperty]] の定義
ドラフト  

ブラウザ実装状況

機能ChromeEdgeFirefoxInternet ExplorerOperaSafari
基本対応491218 なし3610
機能Android webviewChrome for AndroidEdge mobileFirefox for AndroidOpera AndroidiOS SafariSamsung Internet
基本対応4949 あり1836105.0

関連情報

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

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