昨天,我发了一篇关于原型继承和构造函数的文章。我最终确定了一种方法,该方法可以使代码保持整洁,并以可能对性能产生轻微影响为代价将原型单独放置:
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 方法与构造函数一起调用,那就太好了。这样,我可以消除整个自调用私有实例方法。