Object.prototype.__defineSetter__()

非推奨: この機能は非推奨になりました。まだ対応しているブラウザーがあるかもしれませんが、すでに関連するウェブ標準から削除されているか、削除の手続き中であるか、互換性のためだけに残されている可能性があります。使用を避け、できれば既存のコードは更新してください。このページの下部にある互換性一覧表を見て判断してください。この機能は突然動作しなくなる可能性があることに注意してください。

メモ: この機能は非推奨となり、セッターオブジェクト初期化子の構文または Object.defineProperty() API を使用して定義する方法に置き換えられました。このメソッドの動作はウェブの互換性だけのために仕様化されたものであり、どのプラットフォームでも実装することを要求されているわけではありません。どこでも動作するとは限りません。

__defineSetter__()Object インスタンスのメソッドで、オブジェクトのプロパティと関数を結び付け、そのプロパティを設定しようとすると呼び出されるようにします。

構文

js
__defineSetter__(prop, func)

引数

prop

セッター func をバインドするプロパティの名前を表す文字列です。

func

プロパティへ値を設定しようとしたときに呼び出される関数です。この関数は以下の形式をとります。

val

prop に代入しようとしている値。

返値

なし (undefined)。

例外

TypeError

func が関数でない場合に発生します。

解説

Object.prototype 継承するすべてのオブジェクト(つまり、 null プロトタイプオブジェクトを除くすべてのオブジェクト)は __defineSetter__() メソッドを継承しています。このメソッドにより、既存のオブジェクトにセッターを定義することができます。これは、 Object.defineProperty(obj, prop, { set: func, configurable: true, enumerable: true }) と等価であり、プロパティが列挙され、構成可能であり、既存のセッターが存在する場合は保存されることを意味しています。

__defineSetter__() は仕様書で normative optional と定義されており、これは実装することを要求されていないということです。しかし、主要なブラウザーはすべて実装していますし、使い続けられているため、除去される可能性は低いでしょう。ブラウザーが __defineSetter__() を実装する場合、__lookupGetter__()__lookupSetter__()__defineGetter__() の各メソッドも実装する必要があります。

__defineSetter__() の使用

js
const o = {};
o.__defineSetter__("value", function (val) {
  this.anotherValue = val;
});
o.value = 5;
console.log(o.value); // undefined
console.log(o.anotherValue); // 5

標準の方法でセッタープロパティを定義

set 構文を使用すると、オブジェクトが最初に初期化されたときにゲッターを定義することができます。

js
const o = {
  set value(val) {
    this.anotherValue = val;
  },
};
o.value = 5;
console.log(o.value); // undefined
console.log(o.anotherValue); // 5

また、 Object.defineProperty() を使用して、オブジェクト作成後にそのオブジェクトにセッターを定義することもできます。 __defineSetter__() と比較すると、このメソッドではシンボルのプロパティを定義するだけでなく、セッターの列挙可能性や構成可能性を制御することができます。 Object.defineProperty() メソッドは、 Object.prototype を継承していないため __defineSetter__() メソッドがない null プロトタイプオブジェクトでも動作します。

js
const o = {};
Object.defineProperty(o, "value", {
  set(val) {
    this.anotherValue = val;
  },
  configurable: true,
  enumerable: true,
});
o.value = 5;
console.log(o.value); // undefined
console.log(o.anotherValue); // 5

仕様書

Specification
ECMAScript Language Specification
# sec-object.prototype.__defineSetter__

ブラウザーの互換性

BCD tables only load in the browser

関連情報