Getter/Setter或直接引用
Getter / Setter or direct reference?
学习Ember.js,并通过Ruby和Java对getter和setter(访问器)有合理的理解。
在Ember/Javascript中,我似乎严重缺乏理解。例如,在我的控制器/模型中,我不知道是使用object.set(property,value)
还是直接引用object.property = 'value'
例如,在我前面的问题(如何在Controller中获取Model值)中,部分有效答案是使用object.name
而不是object.get('name')
。它起了作用,但我错过了基本的理解。
请澄清。
规则是:当你在.js文件中时,你应该始终使用.get()/.set()
。当你在模板(.hbs或其他)中时,不应该(你不能这样做)。
如果您通过myObj.myProp
访问属性,它将适用于常规属性,但计算属性不会。如果您通过myObj.myProp
设置了一个属性,您仍然可以取回该值,但绑定和观察者不会收到它已经更改并且不会正确更新的通知。
这是Ember团队的一个设计决策,它允许有效的绑定/观察者,而不是对所有绑定/观察到的属性进行脏检查(这是Angular目前所做的)。
我制作了一个小的jsbin来展示这一点。最初绑定三个值,然后按钮更改一个并将其记录到控制台中(因此请确保打开控制台),绑定不会更新,但可以检索值。然后,它试图通过myObj.myProp
获得一个计算的属性,该属性返回未定义,然后以常规方式返回。
http://emberjs.jsbin.com/cipapaxevi/2/
此外,作为旁注。如果你想要一个位于你所拥有的子对象上的属性,你可以通过myObj.get('myProp.myOtherProp')
而不是myObj.get('myProp').get('myOtherProp')
来访问它。它使您不用担心myProp
可能返回null
或undefined
。
这就是Javascript的工作方式,也是它的缺点之一。它既没有公共/私人的礼节,也没有方法。因此,我们应该依赖代码中的良好注释。
我不是Ember方面的专家,但当我在JS中遇到类似的问题时,我通常会查看库的源代码,看看它是如何构建的,然后做出决定。这就是为什么js库通常同时提供min和dev版本的原因。
然而,若对象有特殊的方法来访问其属性,那个么它们存在是有原因的,所以使用它们而不是直接访问属性。正如我上面所说,在Js中,你不能让财产成为私人财产或受保护财产。
- 引用对象中的通用值
- 如何在JavaScript中将字符串转换为函数引用
- 当包含另一个asp文件时,是否也包含所有引用的样式和脚本页面
- 在动态创建的元素上获取对特定选择器的引用
- IIFE中的函数引用不可用
- 如何通过引用var Using DataTables来进行分页或排序
- 如何在创建键时引用来自同一对象的键
- Datatables:通过DOM数据源中的名称引用列
- 自引用回调
- 引用类变量中的原型方法
- 无法获取属性'selectedIndex'的未定义引用或null引用
- Vanilla JS通过引用移除数组元素
- 通过引用传递JavaScript对象
- "实例范围”;TypeScript类的getter/setter
- 无法获取属性'Id'使用Knockout.js的未定义或空引用API
- "“;变量未引用正确的对象
- 获取对使用Tampermonkey使用javascript创建的元素的引用
- 引用属性而不是 getter 和 setter
- 是否可以获得对“”的setter函数的引用;setter”;
- Getter/Setter或直接引用