Object.definePropertyを使用する本当に良い理由は、オブジェクト内の関数を計算されたプロパティとしてループできることです。これにより、関数の本体を返す代わりに関数が実行されます。
例えば:
var myObj = {};
myObj.width = 20;
myObj.height = 20;
Object.defineProperty(myObj, 'area', {
get: function() {
return this.width*this.height;
},
enumerable: true
});
for (var key in myObj) {
if (myObj.hasOwnProperty(key)) {
console.log(key + " -> " + myObj[key]);
}
}
//width -> 20, height -> 20, area -> 400
関数をプロパティとしてオブジェクトリテラルに追加するのとは異なります。
var myObj = {};
myObj.width = 20;
myObj.height = 20;
myObj.area = function() {
return this.width*this.height;
};
for (var key in myObj) {
if (myObj.hasOwnProperty(key)) {
console.log(key + " -> " + myObj[key]);
}
}
// width -> 20, height -> 20, area -> function() { return this.width*this.height;}
ループするために、列挙可能なプロパティをtrueに設定していることを確認してください。