在Backbone中,model.get('foo')和model.attributes.foo之间有什么区别?

时间:2013-04-10 17:13:11

标签: javascript backbone.js

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

  1. var foo = model.get('foo');
  2. var foo = model.attributes.foo;
  3. .get()方法是文档中推荐的方法,但大概有点慢,因为它涉及额外的函数调用。

    我有什么理由不使用.attributes方法吗?是否有任何导致意外行为的情况?

2 个答案:

答案 0 :(得分: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好得多;而且它也更短。

答案 1 :(得分:2)

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

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

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

话虽如此 - 如果没有其他人正在阅读您的代码或更改您的代码但是您,并且您非常关心那些额外的纳秒,并且您知道您将 永远 将来犯这种错误。然后一定要直接使用attributes属性。