Getter / Setter或直接参考?

时间:2014-10-22 08:22:10

标签: javascript ember.js

学习Ember.js并通过Ruby和Java对getter和setter(访问器)有一个合理的理解。

在Ember / Javascript中,我似乎非常缺乏理解。例如,在我的控制器/模型中,我不知道是使用object.set(property,value)还是直接引用它们object.property = 'value'

例如,在我之前的问题(How to get Model values in Controller)中,部分工作回答是使用object.name而不是object.get('name')。它有效,但我错过了基本的理解。

希望得到一些澄清。

2 个答案:

答案 0 :(得分:0)

这就是Javascript的工作方式,这是它的缺点之一。它没有公共/私人礼仪或方法。因此,我们应该依赖代码中的好评。

我不是Ember的专家,但是当我面对JS中的类似问题时,我通常会查看库的源代码,看看它是如何构建的,然后做出决定。这就是为什么js库通常都带有min和dev版本。

但是,如果对象具有访问其属性的特殊方法,那么它们是有原因的,因此使用它们而不是直接访问属性。如上所述,在Js中,您不能将属性设为私有或受保护。

答案 1 :(得分:0)

规则是:当您在.js文件中时,应始终使用.get()/.set()。当你在模板(.hbs或其他)中时,你不应该(你不能这样做)。

如果您通过myObj.myProp访问属性,它将适用于常规属性,但计算属性不会。如果您通过myObj.myProp设置属性,您仍然可以返回值,但不会通知绑定和观察者它已更改并且无法正确更新。

这是Ember团队的一项设计决策,它允许有效的绑定/观察者,而不是对所有绑定/观察到的属性进行脏检查(这是Angular目前所做的)。

我做了一个小jsbin显示这个。最初绑定了三个值,然后按钮更改一个并将其记录到控制台中(因此请确保控制台处于打开状态),绑定不会更新,但可以检索该值。然后,它尝试通过myObj.myProp获取计算属性,该属性返回undefined,然后是常规方式。

http://emberjs.jsbin.com/cipapaxevi/2/

另外,作为旁注。如果您希望子对象上的属性与您拥有的属性相同,则可以通过myObj.get('myProp.myOtherProp')访问它而不是myObj.get('myProp').get('myOtherProp')。它使您免于myProp可能返回nullundefined的担忧。