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