Object.prototype.__defineSetter__()
非推奨: この機能は非推奨になりました。まだ対応しているブラウザーがあるかもしれませんが、すでに関連するウェブ標準から削除されているか、削除の手続き中であるか、互換性のためだけに残されている可能性があります。使用を避け、できれば既存のコードは更新してください。このページの下部にある互換性一覧表を見て判断してください。この機能は突然動作しなくなる可能性があることに注意してください。
メモ: この機能は非推奨となり、セッターはオブジェクト初期化子の構文または Object.defineProperty()
API を使用して定義する方法に置き換えられました。このメソッドの動作はウェブの互換性だけのために仕様化されたものであり、どのプラットフォームでも実装することを要求されているわけではありません。どこでも動作するとは限りません。
__defineSetter__()
は Object
インスタンスのメソッドで、オブジェクトのプロパティと関数を結び付け、そのプロパティを設定しようとすると呼び出されるようにします。
構文
__defineSetter__(prop, func)
引数
返値
なし (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__() の使用
const o = {};
o.__defineSetter__("value", function (val) {
this.anotherValue = val;
});
o.value = 5;
console.log(o.value); // undefined
console.log(o.anotherValue); // 5
標準の方法でセッタープロパティを定義
set
構文を使用すると、オブジェクトが最初に初期化されたときにゲッターを定義することができます。
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
プロトタイプオブジェクトでも動作します。
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