JavaScript/Object/prototype/ defineGetter


Object.prototype.__defineGetter__() は、オブジェクトのプロパティにゲッター関数を定義するメソッドです。これにより、プロパティにアクセスしたときに指定した関数が実行されるようになります[1]

構文

編集
obj.__defineGetter__(prop, func)
  • prop: ゲッターを定義するプロパティ名(文字列またはシンボル)。
  • func: プロパティが読み取られたときに呼び出される関数。

基本的な使用例

編集

以下のプログラムは、__defineGetter__() を使用してオブジェクトにゲッター関数を定義する方法を示しています。

const obj = {};
obj.__defineGetter__('fullName', function() {
  return <code>${this.firstName} ${this.lastName}</code>;
});

obj.firstName = 'John';
obj.lastName = 'Doe';

console.log(obj.fullName); // "John Doe"

このプログラムでは、fullName プロパティにアクセスすると、定義したゲッター関数が実行され、firstNamelastName を結合した値が返されます。

Object.defineProperty() との比較

編集

以下のプログラムは、__defineGetter__()Object.defineProperty() の両方を使用してゲッターを定義する方法を比較しています。

// __defineGetter__() を使用
const obj1 = {};
obj1.__defineGetter__('greeting', function() {
  return 'Hello, ' + this.name;
});
obj1.name = 'Alice';

// Object.defineProperty() を使用(推奨)
const obj2 = {};
Object.defineProperty(obj2, 'greeting', {
  get: function() {
    return 'Hello, ' + this.name;
  },
  configurable: true,
  enumerable: true
});
obj2.name = 'Bob';

console.log(obj1.greeting); // "Hello, Alice"
console.log(obj2.greeting); // "Hello, Bob"

このプログラムでは、両方のメソッドが同様の結果を生み出しますが、Object.defineProperty() はより詳細な制御(設定可能性や列挙可能性など)が可能です。

計算プロパティの作成

編集

以下のプログラムは、__defineGetter__() を使用して計算プロパティを作成する例を示しています。

const circle = {
  radius: 5
};

circle.__defineGetter__('area', function() {
  return Math.PI * this.radius * this.radius;
});

circle.__defineGetter__('circumference', function() {
  return 2 * Math.PI * this.radius;
});

console.log(circle.area); // 78.53981633974483
console.log(circle.circumference); // 31.41592653589793

// radius を変更すると計算プロパティも自動的に更新される
circle.radius = 10;
console.log(circle.area); // 314.1592653589793

このプログラムでは、areacircumference の計算プロパティを定義しています。radius を変更すると、これらのプロパティの値も自動的に更新されます。

注意点

編集
  • 非推奨: __defineGetter__() は非標準のメソッドであり、代わりに Object.defineProperty() の使用が推奨されています。
  • 命名規則: 二重アンダースコア(__)で始まるメソッド名は通常、内部メソッドや実装詳細を示します。
  • プロパティの上書き: 既存のプロパティに対してゲッターを定義すると、そのプロパティの以前の値は上書きされます。
  • アクセス制御: ゲッターのみを定義した場合、そのプロパティは読み取り専用になります。書き込み可能にするには、__defineSetter__() も定義する必要があります。
  • 互換性: すべてのJavaScript環境がこのメソッドをサポートしているわけではありません。

脚註

編集
  1. ^ このメソッドは非標準であり、代わりに Object.defineProperty() の使用が推奨されています。

外部リンク

編集