来自getter

时间:2018-02-05 23:36:19

标签: javascript ecmascript-6

我想从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);




然而,这似乎很复杂..有一种更简单的方法吗?

2 个答案:

答案 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。如果0p的合法值,那么您需要将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中执行,这是低效的。