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
プロパティにアクセスすると、定義したゲッター関数が実行され、firstName
と lastName
を結合した値が返されます。
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
このプログラムでは、area
と circumference
の計算プロパティを定義しています。radius
を変更すると、これらのプロパティの値も自動的に更新されます。
注意点
編集- 非推奨:
__defineGetter__()
は非標準のメソッドであり、代わりにObject.defineProperty()
の使用が推奨されています。 - 命名規則: 二重アンダースコア(
__
)で始まるメソッド名は通常、内部メソッドや実装詳細を示します。 - プロパティの上書き: 既存のプロパティに対してゲッターを定義すると、そのプロパティの以前の値は上書きされます。
- アクセス制御: ゲッターのみを定義した場合、そのプロパティは読み取り専用になります。書き込み可能にするには、
__defineSetter__()
も定義する必要があります。 - 互換性: すべてのJavaScript環境がこのメソッドをサポートしているわけではありません。
脚註
編集- ^ このメソッドは非標準であり、代わりに
Object.defineProperty()
の使用が推奨されています。