Javascript 从 getter 调用 setter

标签 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);

但是这看起来很复杂..有更简单的方法吗?

最佳答案

看来你可以从此简化你的 setter/getter :

   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
}
<小时/>

附注如果 0p 的合法值,那么您需要将 if (this.pval) 更改为 if (this.pval) 。 pval === 未定义)

关于Javascript 从 getter 调用 setter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48633251/

相关文章:

javascript - 无法读取未定义的属性“导航”

javascript - DataTables:未捕获类型错误:无法读取未定义的属性 'defaults'

javascript - 删除对象数组中的 `undefined`

javascript - 如何从此购物车中移除商品?

javascript - 'else' 之后不必要的 'return' 。 (不返回)

javascript - 在 es6 中将 props 传递给子组件

javascript控制台-infinity,这是什么意思?

node.js - 如何使用 ES6 语法导入类? (没有巴别塔)

javascript - 如何在方表中找到一个数字所属的一组数字的索引?

javascript - 使用 forEach es6 将对象数组添加到对象数组中