何时使用getter/setter以及何时安全地省略它们?

Kit*_*ten 5 ember.js

根据http://emberjs.com/guides/object-model/classes-and-instances/,需要使用getter和setter访问属性:

访问对象的属性时,请使用get和set访问器方法.

确保使用这些访问方法; 否则,计算属性不会重新计算,观察者不会触发,模板也不会更新.

我知道在更改属性时需要使用setter让Ember知道更改,以便更新绑定,但是读取属性呢?

来自http://emberjs.com/guides/object-model/classes-and-instances/的示例

App.Person = Ember.Object.extend({
  say: function(thing) {
    var name = this.get('name');
    alert(name + " says: " + thing);
  }
});

var yehuda = App.Person.create({
  name: "Yehuda Katz"
});

yehuda.say("Yes");
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,this.get('name')用于访问属性name,但是方法say被定义为类的属性,App.Person并且可以通过点表示法直接访问.虽然方法和属性之间存在明显的用法差异,但在JavaScript中,两者的实现没有区别.如果我替换this.get('name'),该示例仍然有效this.name.

  1. Ember在对象的方法和属性方面是否存在任何实现差异?
  2. 直接访问方法总是安全的吗?
  3. 是否必须始终通过getter访问包括计算属性在内的所有属性?如果没有,何时直接访问属性是安全的?

我绝对想坚持这里的最佳实践,每次都使用getter/setter,但我想了解Ember.js的内部:)

giv*_*nse 9

  1. Ember中方法或属性的定义与Vanilla JavaScript中的定义相同,但它们在Ember中的解析不同.您没有使用POJO.每次从Route/Controller/View扩展时,都会添加以不同方式处理方法和属性的Ember图层.
  2. 不,并不总是安全的.在你的情况下,这是因为它过于简单.
  3. 是的,始终使用访问属性get.

用户与您的应用程序的交互是导致对象属性发生变化的原因,我们处理与事件的交互.当触发Ember中的事件时,它不会立即解决,而是将其置于优先级队列中并在以后解决.

属性以异步形式更新和读取,如果您直接使用它们this,则无法保证您将获得最新的值.

检查:管理异步

当您对Ember中的属性进行更改时,它不会立即传播该更改.相反,它会立即使任何依赖属性无效,但会将实际更改排入队列.

因此,当您更改属性的值时,大致会发生以下情况:

  1. 酒店已更改
  2. 所有相关属性均无效
  3. 将实际更改排队等待以后
  4. 等待当前用户的任何其他事件处理程序完成
  5. 刷新更改队列
    • 在此之前,该物业实际上已更新(并将this照常工作)

想象一下,您使用this读取属性,但发生一些其他更改其值的事件.在刷新队列之前,新值将不可用,但this会立即读取属性并返回计划很快更新的属性的值.你得到陈旧的数据.方法getset为您管理此异步并始终保证新值.

当您只有一个属性时,在整个应用程序中,将不会注意到此异步机制.

Ember中有许多不同的队列,所有这些背后的基本机制是运行循环.