2

在 Backbone.js 中,有两种方法可以获取单个属性的值:

  1. var foo = model.get('foo');
  2. var foo = model.attributes.foo;

.get()方法是文档中推荐的方法,但可能会慢一些,因为它涉及额外的函数调用。

我有什么理由不应该使用这种.attributes方法吗?是否存在会导致意外行为的情况?

4

2 回答 2

4

这是一个封装问题。通过使用 get 方法,您说我不在乎它是如何实现的,我只想要那个属性。因此,将来如果您想覆盖您的 get 方法以返回更有意义的内容,您将不会在使用该属性的任何地方进行代码更改。

例如,如果您的模型有一个与之关联的属性成本,它是一个数字。

model.get('cost') //would give you that number say 1999.99 

现在将来假设您希望它返回格式化的字符串,您可以覆盖 get 方法。

model.get('cost') // same method would now give you $1999.99 or EUR 1999,99 in french :)

此外,您正在减少代码量并提高可读性。

model.get('foo') 读起来比 model.attributes.foo 好得多;它也更短。

于 2013-04-10T20:56:07.407 回答
2

正如您所提到的,在您的问题中,该.get()方法是文档中推荐的方法。尽管直接调用该属性会为您节省几纳秒,但您不应该这样做。

原因是它可能会鼓励阅读您的代码的人使用相同的方法来设置属性:model.attributes.foo = 'blah';

我可能不必告诉你这会很糟糕。代码可能看起来有效,因为您在模型上获得了正确的值,但是您绕过了主干中内置的所有更改跟踪逻辑。如果您以这种方式设置属性,则不会触发任何事件。

话虽这么说 - 如果没有其他人在阅读您的代码或更改您的代码,但您,并且您非常关心这些额外的纳秒并且您知道您将来永远不会犯这种类型的错误。然后无论如何,直接使用 attributes 属性。

于 2013-04-10T17:39:31.830 回答