[英]JavaScript object with public getter and setter methods
昨天,我發布了有關原型繼承和構造函數的文章 。 我最終選擇了一種方法,該方法可使代碼保持整潔,並以可能對性能造成較小影響為代價而將原型留給他人:
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);
}
但是,這種方法的問題在於,每當我想要設置Card實例的值來進行驗證時,都必須調用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方法與構造函數一起調用會很好。 這樣,我可以消除整個自調用私有實例方法。
函數是Javascript中的一流對象,因此您完全可以執行以下操作來消除重復:
function setter (x) {
if (!range[x]) {
return false;
}
return x;
}
(function (x) {
value = setter(x);
if (!value) {
value = drawRandom();
}
}(val));
this.__defineGetter__("value", function () {
return value;
});
// Some code duplication
this.__defineSetter__("value", setter);
首先,您應該始終使用obj.value = newValue
設置value
,即使在內部也要設置,因為它會調用您的驗證。 在構造函數中時,這意味着:
this.value = val;
但是,如果在聲明setter和getter 之前執行此操作,將無法正常工作。 因此,將其移到后面,以便設置器在設置時存在。
這里的工作示例: http : //jsfiddle.net/8tCjm/4/
var drawRandom = function () {
return Math.floor(Math.random() * 3) + 1;
};
var range = {
1: 'Ace',
2: 'Two',
3: 'Three'
};
function Card(val) {
var value;
this.__defineGetter__('value', function () {
return value;
});
this.__defineSetter__('value', function (x) {
if (range[x]) {
value = x;
} else {
value = drawRandom();
}
return value;
});
this.value = val;
};
console.log(new Card(1).value); // 1
console.log(new Card(2).value); // 2
console.log(new Card(3).value); // 3
console.log(new Card(987).value); // not 987 (1-3)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.