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

时间:2014-05-15 14:49:52

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

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

  1. Ember在对象的方法和属性方面是否存在任何实现差异?
  2. 直接访问方法总是安全吗?
  3. getter是否必须始终访问包括计算属性在内的所有属性?如果没有,何时直接访问属性是安全的?
  4. 我绝对想在这里坚持最佳实践,即每次使用getter / setter,但我想了解Ember.js的内部:)

1 个答案:

答案 0 :(得分:9)

  1. Ember中方法或属性的定义与Vanilla JavaScript中的定义相同,但它们在Ember中的解析不同。您没有使用POJO。每次从Route / Controller / View扩展时,都会添加以不同方式处理方法和属性的Ember层。
  2. 不,并不总是安全的。在你的情况下,这是因为它过于简单。
  3. 是的,始终使用get访问属性。
  4. 用户与您的应用互动是导致对象属性发生变化的原因,我们会处理与事件的互动。当Ember中的事件被触发时,它不会立即被解决,而是被放入优先级队列并在以后解决。

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

    检查:Managing Asynchrony

      

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

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

    1. 属性已更改
    2. 所有相关属性均无效
    3. 将以后的实际更改排队
    4. 等待当前用户的任何其他事件处理程序完成
    5. 刷新更改队列
      • 在此之前,该属性实际上已更新(this将照常工作)
    6. 想象一下,您使用this来读取属性,但会发生一些其他更改其值的事件。在刷新队列之前,新值将无法使用,但this会立即读取属性并返回计划很快更新的属性的值。你得到陈旧的数据。方法getset为您管理此异步并始终保证新值。

      当你只有一个属性时,在整个应用程序中,这个异步机制不会被注意到。

      Ember中有许多不同的队列,所有这些背后的基本机制是the run loop