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

ブラウザ実装状況

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

凡例

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

関連情報

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

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