在 Backbone.js 中,有两种方法可以获取单个属性的值:
var foo = model.get('foo');
var foo = model.attributes.foo;
该.get()
方法是文档中推荐的方法,但可能会慢一些,因为它涉及额外的函数调用。
我有什么理由不应该使用这种.attributes
方法吗?是否存在会导致意外行为的情况?
在 Backbone.js 中,有两种方法可以获取单个属性的值:
var foo = model.get('foo');
var foo = model.attributes.foo;
该.get()
方法是文档中推荐的方法,但可能会慢一些,因为它涉及额外的函数调用。
我有什么理由不应该使用这种.attributes
方法吗?是否存在会导致意外行为的情况?
这是一个封装问题。通过使用 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 好得多;它也更短。
正如您所提到的,在您的问题中,该.get()
方法是文档中推荐的方法。尽管直接调用该属性会为您节省几纳秒,但您不应该这样做。
原因是它可能会鼓励阅读您的代码的人使用相同的方法来设置属性:model.attributes.foo = 'blah';
我可能不必告诉你这会很糟糕。代码可能看起来有效,因为您在模型上获得了正确的值,但是您绕过了主干中内置的所有更改跟踪逻辑。如果您以这种方式设置属性,则不会触发任何事件。
话虽这么说 - 如果没有其他人在阅读您的代码或更改您的代码,但您,并且您非常关心这些额外的纳秒,并且您知道您将来永远不会犯这种类型的错误。然后无论如何,直接使用 attributes 属性。