我想从getter调用setter来初始化默认值而不重复设置逻辑。
我确实提出了一个使用getOwnPropertyDescriptor的解决方案:
var o = {
set p(val) {
// setting logic
alert(val);
this.pval = val;
},
get p() {
if (!this.pval) {
const psetter = Object.getOwnPropertyDescriptor(this, 'p').set.bind(this);
psetter(10); // default to 10
}
return this.pval;
}
}
alert(o.p);

然而,这似乎很复杂..有一种更简单的方法吗?
答案 0 :(得分:4)
看起来你可以从中简化你的吸气剂:
get p() {
if (!this.pval) {
const psetter = Object.getOwnPropertyDescriptor(this, 'p').set.bind(this);
psetter(10); // default to 10
}
return this.pval;
}
到此:
get p() {
if (!this.pval) {
this.p = 10; // trigger setter to set default val
}
return this.pval;
}
如果默认值不必由setter计算并且可以在对象初始化时知道,那么在第一次创建时将pval
属性初始化为适当的默认值会更简单对象,在声明时(如果它是静态对象)或在构造函数中,如果您使用工厂函数或类。然后,您不必从getter调用setter,因为已经设置了默认值。确保默认值初始化的另一种方法如下所示:
var o = {
set p(val) {
// setting logic
this.pval = val;
},
get p() {
return this.pval;
},
pval: 10 // initialize default value
}
P.S。如果0
是p
的合法值,那么您需要将if (this.pval)
更改为if (this.pval === undefined)
。
答案 1 :(得分:0)
在对象创建后简单地初始化它。
var o = {
set p(val) {
// setting logic
alert(val);
this.pval = val;
},
get p() {
return this.pval;
}
}
// initialize value after object creation
o.p = 10
alert(o.p);
使用getter进行变量初始化将在每次get中执行,这是低效的。