Object.prototype.__lookupSetter__()

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

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

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

構文

js
__lookupSetter__(prop);

引数

prop

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

返値

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

解説

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

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

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

__lookupSetter__() の使用

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

js
const obj = {
  set foo(value) {
    this.bar = value;
  },
};

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

関連情報