昨天我發佈了大約prototypal inheritance and constructors。我最終選擇的是保持代碼漂亮和整潔,獨自離開了樣機的可能小的性能影響成本的方法:公共getter和setter方法的JavaScript對象
function Card(value) {
// setValue is a public instance method
this.setValue = function (val) {
if (!range[val]) {
val = drawRandom();
}
// value is a public instance variable
this.value = val;
return val;
};
this.setValue(value);
}
我的這種方法的問題,然而,就是我要調用的setValue方法,每當我想設置卡實例的值來驗證。我想要做的是有一個自定義的setter方法。這是我到目前爲止:
function Card(val) {
// value is a private instance variable
var value;
// This is a private instance method
// It's also self-invoking, but that's beside the point
(function (x) {
if (!range[x]) {
x = drawRandom();
}
value = x;
}(val));
this.__defineGetter__("value", function() {
return value;
});
// Some code duplication
this.__defineSetter__("value", function (x) {
if (!range[x]) {
return false;
}
value = x;
return x;
});
}
這很好。調用var card = new Card()
給了我一個隨機值的實例,並且調用card.value = null
失敗,因爲它超出範圍。
我的問題,這一點,不是事實,這顯然是更長的時間等,是它好像我複製一些代碼。如果setter方法和構造函數一起被調用,那將會很好。這樣,我可以消除整個自行調用的私有實例方法。
爲什麼不乾脆在定義setter方法後寫'this.value = val;'? (對不起,我花了這麼多的嘗試正確地評論這個評論:-) – Pointy 2012-07-26 19:49:35
' Object.defineProperty'被更廣泛的支持 – 2012-07-26 19:51:16