はget
、プロパティ アクセサー関数を定義します。foo
プロパティ onの値o
が取得されると、コード内の関数呼び出しのように見えなくても、その関数が呼び出されます。次に例を示します。
var a = o.foo; // Note that `foo` doesn't have () after it, it's not a function call
この場合、常に 17 を返しますが、代わりに別のことを行うこともできます。たとえば、円を考えてみましょう:
var circle = {
radius: 7,
get circumference() { return 2 * Math.PI * this.radius; },
get area() { return Math.PI * this.radius * this.radius; }
};
console.log(circle.circumference); // 43.982297150257104
console.log(circle.area); // 153.93804002589985
circle.radius = 4;
console.log(circle.circumference); // 25.132741228718345
console.log(circle.area); // 50.26548245743669
ご覧のとおり、アクセサーで定義した 2 つのプロパティにアクセスすると、プロパティ アクセスが関数呼び出しのように見えなくても、それらに割り当てられた関数が呼び出されます。
プロパティが設定されたときに呼び出される関数を持つこともできます。当然のことながら、set
ではなくを使用してそれを行いますget
。:-)
これについては、仕様のオブジェクト初期化子の部分とMDNで詳しく読むことができます。
このObject.getOwnPropertyDescriptor
呼び出しは、要求したプロパティ (この場合はfoo
) を説明するオブジェクトを返します。詳細については、仕様とMDNでも読むことができます。
MDN からの引用:
プロパティ記述子は、次の属性の一部を持つレコード(TJC: オブジェクトなど)です。
value
プロパティに関連付けられた値 (データ記述子のみ)。
writable
true
プロパティに関連付けられた値が変更される可能性がある場合のみ (データ記述子のみ)。
get
プロパティのゲッターとして機能する関数、またはundefined
ゲッターがない場合 (アクセサー記述子のみ)。
set
プロパティのセッターとして機能する関数、またはundefined
セッターがない場合 (アクセサー記述子のみ)。
configurable
true
このプロパティ記述子の型が変更される可能性があり、対応するオブジェクトからプロパティが削除される可能性がある場合に限ります。
enumerable
true
対応するオブジェクトのプロパティの列挙中にこのプロパティが表示される場合にのみ。