BackboneJS框架的技巧及模式(1)
原文见:http://coding.smashingmagazine.com/2013/08/09/backbone-js-tips-patterns/
译者注:本文采用意译,省略所有口水话,内容直指要义。
作者:chszs,转载需注明。博客主页:http://blog.csdn.net/chszs
BackboneJS是一个流行的JavaScript MVC/MVVM框架,第一版发布于三年多前,到现在已经是一个颇有影响力的框架。尽管BackboneJS提供了JavaScript项目的基本结构,但它还留下了很多设计模式和决策供开发者使用。
因此,本文会介绍很多不同的设计模式供BackboneJS开发过程中使用,还会介绍一些开发中可能遇到的陷阱。
应用就和建筑一样,都是遵循已知的模式进行构建。
JavaScript把所有的原生类型变量都以值传递的方式对待。因此,当原生类型的变量被引用时,变量的值会被传递。
比如,上面代码中,设置helloWorldCopy变量的值等同于helloworld变量。因此,任何修改变量helloWorldCopy值的行为并不会影响到helloWorld变量,因为这是一份拷贝。
JavaScript把所有的非原生类型的变量都以参数传递的方式对待。这意味着当非原生类型的变量被引用时,JavaScript会传递变量的内存地址。
实现一个深度模型对象的复制可能会让你在调试中避免掉入兔子洞。
此问题对于BackboneJS新手要引起注意,甚至一些JavaScript老手也该提防。
在这里:https://github.com/documentcloud/backbone/issues/2315有深度的讨论。
正如Jeremy Ashkenas所说,实现深度复制是用于解决不同的问题,尤其是在很大、有深度的对象来说,此操作的内存开销很大。
幸运的是,jQuery库提过了一个深度复制的实现,即$.extend操作。顺便说一句,UnderscoreJS框架(它依赖于BackboneJS),也提供了_.extend这样的函数,但是我们应该尽量避免使用它,因为它没有实现深度复制。
Lo-Dash (http://lodash.com/)是UnderscoreJS的分支和优化版本,提供了_.clone函数,实现了深度复制。但是,我使用$.extend来实现任意对象的深度复制,对象是通过.get()从模型中获取的。记住要传递true,它指示执行对象的深度复制。
var address = $.extend(true, {}, person.address);