Object.prototype.__lookupSetter__()
非推奨: この機能は非推奨になりました。まだ対応しているブラウザーがあるかもしれませんが、すでに関連するウェブ標準から削除されているか、削除の手続き中であるか、互換性のためだけに残されている可能性があります。使用を避け、できれば既存のコードは更新してください。このページの下部にある互換性一覧表を見て判断してください。この機能は突然動作しなくなる可能性があることに注意してください。
メモ: この機能は非推奨となり、 Object.getOwnPropertyDescriptor()
API に置き換えられました。このメソッドの動作はウェブの互換性だけのために仕様化されたものであり、どのプラットフォームでも実装することを要求されているわけではありません。どこでも動作するとは限りません。
__lookupSetter()__
は Object
インスタンスのメソッドで、指定されたプロパティに結びつけられているセッター関数を返します。
構文
__lookupSetter__(prop);
引数
prop
-
セッター関数を返すプロパティの名前を表す文字列です。
返値
指定したプロパティのセッターとしてバインドされた関数です。そのようなプロパティが得られない場合、またはプロパティがデータプロパティである場合は undefined
を返します。
解説
Object.prototype
継承するすべてのオブジェクト(つまり、 null
プロトタイプオブジェクトを除くすべてのオブジェクト)は __lookupSetter__()
メソッドを継承しています。オブジェクトのプロパティにセッターが定義されている場合、そのプロパティは設定時に関数を呼び出すだけなので、そのプロパティを通してセッター関数を参照することはできません。 __lookupSetter__()
を使用することで、そのセッター関数を参照することができます。
__lookupSetter__()
は、指定したプロパティを探すためにプロトタイプチェーンを走査します。プロトタイプチェーンの中にあるオブジェクトが指定した自分自身のプロパティを持っている場合、そのプロパティのプロパティ記述子の set
属性を返します。そのプロパティがデータプロパティの場合は、undefined
を返します。プロパティがプロトタイプチェーン全体で得られない場合、 undefined
を返します。
__lookupSetter__()
は仕様書で "normative optional" と定義されており、これは実装することを要求されていないということです。しかし、主要なブラウザーはすべて実装していますし、使い続けられているため、除去される可能性は低いでしょう。ブラウザーが __lookupSetter__()
を実装する場合、__lookupGetter__()
、__defineGetter__()
、__defineSetter__()
の各メソッドも実装する必要があります。
例
__lookupSetter__() の使用
const obj = {
get foo() {
return Math.random() > 0.5 ? "foo" : "bar";
},
};
// 標準外かつ非推奨の方法
obj.__lookupSetter__("foo");
// (function(value) { this.bar = value; })
標準の方法でセッタープロパティを参照
プロパティのセッターを参照するには、 Object.getOwnPropertyDescriptor()
API を使用しましょう。 __lookupSetter__()
と比較して、このメソッドではシンボルプロパティを参照することができます。 Object.getOwnPropertyDescriptor()
メソッドは、 Object.prototype
を継承しないため __lookupSetter__()
メソッドを持たない null
プロトタイプオブジェクトでも動作します。もし __lookupSetter__()
のプロトタイプチェーンを走査する動作が重要であれば、 Object.getPrototypeOf()
を使って自分で実装することができます。
const obj = {
set foo(value) {
this.bar = value;
},
};
Object.getOwnPropertyDescriptor(obj, "foo").set;
// [Function: set foo]
const obj2 = {
__proto__: {
set foo(value) {
this.bar = value;
},
},
};
function findSetter(obj, prop) {
while (obj) {
const desc = Object.getOwnPropertyDescriptor(obj, prop);
if (desc) {
return desc.set;
}
obj = Object.getPrototypeOf(obj);
}
}
console.log(findSetter(obj2, "foo")); // [Function: set foo]
仕様書
Specification |
---|
ECMAScript Language Specification # sec-object.prototype.__lookupSetter__ |
ブラウザーの互換性
BCD tables only load in the browser