在Backbone.js的,有两种方法可以得到一个属性的值:在Backbone中,model.get('foo')和model.attributes.foo之间的任何区别?
var foo = model.get('foo');
var foo = model.attributes.foo;
的.get()
方法是一个在文档建议,但大概是慢一点,因为它涉及一个额外的函数调用。
我有什么理由不应该使用.attributes
方法?是否有任何情况会导致意外的行为?
在Backbone.js的,有两种方法可以得到一个属性的值:在Backbone中,model.get('foo')和model.attributes.foo之间的任何区别?
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';
我可能没有告诉你,这是不好的。代码似乎可以工作,因为您在模型上获得了正确的值,但是您绕过了内置在主干中的所有更改跟踪逻辑。如果以这种方式设置属性,则不会触发任何事件。
话虽这么说 - 如果没有其他人阅读你的代码或改变你的代码,但你和你关心的这些额外纳秒是多,你知道你会永远使该类型的未来的错误。然后通过一切手段,直接使用属性属性。