Getter/Setter或直接引用

Getter / Setter or direct reference?

本文关键字:引用 Setter Getter      更新时间:2023-09-26

学习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可能返回nullundefined

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

我不是Ember方面的专家,但当我在JS中遇到类似的问题时,我通常会查看库的源代码,看看它是如何构建的,然后做出决定。这就是为什么js库通常同时提供min和dev版本的原因。

然而,若对象有特殊的方法来访问其属性,那个么它们存在是有原因的,所以使用它们而不是直接访问属性。正如我上面所说,在Js中,你不能让财产成为私人财产或受保护财产。