【问题标题】:Computed Properties in node.jsnode.js 中的计算属性
【发布时间】:2016-01-09 03:49:32
【问题描述】:

我真的爱上了 Ember.js 中的计算属性。 node.js 中计算属性的最接近的实现是什么?

编辑: 应该更精确一点。 embers 计算属性的酷炫特性是

  • 语法简单
  • 许多解决常见模式的助手,例如Ember.computed.and() 或 Ember.computed.any()
  • getter 仅在使用依赖属性时调用一次。然后缓存 getter 值,直到相关属性发生更改。
  • 只有在访问属性时才会调用 getter。

所有这些导致对象定义更像声明,功能代码很少,但包含很多功能。

【问题讨论】:

  • 您还有更广泛的问题吗?
  • 只为您准备的非广泛问题 :)
  • 作为对您的编辑的回应,我在我的回答中添加了一些关于依赖跟踪的注释。

标签: javascript node.js ember.js


【解决方案1】:

您可以使用标准的 getter/setter(几乎在所有 JS 环境中都可用)。

var person = {
  firstName: 'Mike',
  lastName: 'C',
  get fullName() {
    return this.firstName + ' ' + this.lastName;
  },
  set fullName(val) {
      var valArray = val.split(/\s/);
      this.firstName = valArray[0];
      this.lastName = valArray[1];
      return val;
  }
};
console.log(person.fullName); // Mike C
person.lastName = 'Myers';
console.log(person.fullName); // Mike Myers
person.fullName = 'John Doe';
console.log(person.firstName); // John

Ember 和 KnockoutJS 等框架与 vanilla JS(Node.js 的所有功能以及一些用于 I/O 等 API)的区别在于它们处理依赖关系跟踪的能力。没有开箱即用地提供依赖关系跟踪。有一个Object.observe 的提议,它允许依赖跟踪(你仍然需要自己做一些工作),但已经从标准中删除,所以不要打算使用它。

【讨论】:

    【解决方案2】:

    看看Object.defineProperiesObject.definePropery。它们将允许您为对象的属性定义 getter 和 setter。

    var person = { first: 'John', last: 'Doe' };
    Object.defineProperty(person, 'fullName', {
      get: function(){ return this.first + ' ' + this.last },
      set: function(val){
        var pair = val.split(/\s/);
        this.first = pair[0];
        this.last = pair[1];
        return val;
      }
    });
    

    【讨论】:

      猜你喜欢
      • 2020-12-01
      • 2020-02-05
      • 2014-01-23
      • 2017-08-23
      • 2012-03-27
      • 2023-03-04
      • 1970-01-01
      • 2022-01-05
      • 2020-05-17
      相关资源
      最近更新 更多