【发布时间】:2012-07-25 11:45:46
【问题描述】:
昨天,我发布了关于prototypal inheritance and constructors 的信息。我最终决定采用一种方法,使代码保持整洁,并以可能对性能产生轻微影响为代价让原型保持独立:
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 方法与构造函数一起被调用,那就太好了。这样,我可以消除整个自调用私有实例方法。
【问题讨论】:
-
为什么不在定义setter方法后直接写
this.value = val;呢? (对不起,我花了很多时间来正确地表达该评论:-) -
Object.defineProperty得到更广泛的支持
标签: javascript class inheritance constructor prototype