Object.prototype.__lookupGetter__()

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

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

__lookupGetter__()Object インスタンスのメソッドで、指定されたプロパティに結びつけられているゲッター関数を返します。

構文

js
__lookupGetter__(prop)

引数

prop

ゲッター関数を返すプロパティの名前を表す文字列です。

返値

指定したプロパティのゲッターとしてバインドされた関数です。そのようなプロパティが得られない場合、またはプロパティがデータプロパティである場合は undefined を返します。

解説

Object.prototype 継承するすべてのオブジェクト(つまり、 null プロトタイプオブジェクトを除くすべてのオブジェクト)は __lookupGetter__() メソッドを継承しています。オブジェクトのプロパティにゲッターが定義されている場合、そのプロパティはその関数の返値を参照しているため、そのプロパティを通してゲッター関数を参照することはできません。 __lookupGetter__() を使用することで、そのゲッター関数を参照することができます。

__lookupGetter__() は、指定したプロパティを探すためにプロトタイプチェーンを走査します。プロトタイプチェーンの中にあるオブジェクトが指定した自分自身のプロパティを持っている場合、そのプロパティのプロパティ記述子get 属性を返します。そのプロパティがデータプロパティの場合は、undefined を返します。プロパティがプロトタイプチェーン全体で得られない場合、 undefined を返します。

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

__lookupGetter__() の使用

js
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() を使って自分で実装することができます。

js
const obj = {
  get foo() {
    return Math.random() > 0.5 ? "foo" : "bar";
  },
};

Object.getOwnPropertyDescriptor(obj, "foo").get;
// [Function: get foo]
js
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

関連情報