backbone必须依赖underscore.js才能够使用,它必须通过underscore中的函数来完成访问页面元素、处理元素的基本操作。
注:backbone可以很好的与其它js库一起工作,所以说它是一个库,而不是框架。
Underscore并没有对原生对象进行扩展,而是调用_()方法进行封装,一旦封装完成,js对象就变为Underscore对象,也可以通过Underscore对象的Value()方法获取原生js对象中的数据。(jquery通过$()方法得到Jquery对象)
Underscore总共有60多个函数,按照处理对象的不同,可以分为集合类、数组类、功能函数类、对象类、工具函数类五大类模块。
underscore template()函数说明:
该函数包含三种模板:
(1)<% %>:包含逻辑代码,渲染后不会展现。
(2)<%= %>:数据类型,渲染后展示数据。
(3)<%- %>:将HTML标记转换为常用字符串,以避免代码攻击。
调用格式:
_.template(templateString, [data], [setting])
没有实现双向数据绑定。
1、Underscore对象封装
Underscore并没有在原生的JavaScript对象原型中进行扩展,而是像jQuery一样,将数据封装在一个自定义对象中(下文中称“Underscore对象”)。
你可以通过调用一个Underscore对象的value()方法来获取原生的JavaScript数据,例如:
// 定义一个JavaScript内置对象 var jsData = { name : 'data' } // 通过_()方法将对象创建为一个Underscore对象 // underscoreData对象的原型中包含了Underscore中定义的所有方法,你可以任意使用 var underscoreData = _(jsData); // 通过value方法获取原生数据, 即jsData underscoreData.value();
2、优先调用JavaScript 1.6内置方法
Underscore中有许多方法在JavaScript1.6中已经被纳入规范,因此在Underscore对象内部,会优先调用宿主环境提供的内置方法(如果宿主环境已经实现了这些方法),以此提高函数的执行效率。
而对于不支持JavaScript 1.6的宿主环境,Underscore会通过自己的方式实现,而对开发者来说,这些完全是透明的。
这里所说的宿主环境,可能是Node.js运行环境,或客户端浏览器。
3、改变命名空间
Underscore默认使用_(下划线)来访问和创建对象,但这个名字可能不符合我们的命名规范,或容易引起命名冲突。
我们可以通过noConflict()方法来改变Underscore的命名,并恢复_(下划线)变量之前的值,例如:
<script type="text/javascript"> var _ = '自定义变量'; </script> <script type="text/javascript" src="https://www.jb51.net/underscore/underscore-min.js"></script> <script type="text/javascript"> // Underscore对象 console.dir(_); // 将Underscore对象重命名为us, 后面都通过us来访问和创建Underscore对象 var us = _.noConflict(); // 输出"自定义变量" console.dir(_); </script>
4、链式操作
还记得我们在jQuery中是如何进行链接操作吗?例如:
$('a') .css('position', 'relative') .attr('href', '#') .show();
Underscore同样支持链式操作,但你需要先调用chain()方法进行声明:
var arr = [10, 20, 30]; _(arr) .chain() .map(function(item){ return item++; }) .first() .value();
如果调用了chain()方法,Underscore会将所调用的方法封装在一个闭包内,并将返回值封装为一个Underscore对象并返回:
// 这是Underscore中实现链式操作的关键函数,它将返回值封装为一个新的Underscore对象,并再次调用chain()方法,为方法链中的下一个函数提供支持。 var result = function(obj, chain) { return chain ? _(obj).chain() : obj; }
5、扩展Underscore
我们可以通过mixin()方法轻松地向Underscore中扩展自定义方法,例如:
_.mixin({ method1: function(object) { // todo }, method2: function(arr) { // todo }, method3: function(fn) { // todo } });
这些方法被追加到Underscore的原型对象中,所有创建的Underscore对象都可以使用这些方法,它们享有和其它方法同样的环境。
6、遍历集合
each()和map()方法是最常用用到的两个方法,它们用于迭代一个集合(数组或对象),并依次处理集合中的每一个元素,例如:
var arr = [1, 2, 3]; _(arr).map(function(item, i) { arr[i] = item + 1; }); var obj = { first : 1, second : 2 } _(obj).each(function(value, key) { return obj[key] = value + 1; });
map()方法与each()方法的作用、参数相同,但它会将每次迭代函数返回的结果记录到一个新的数组并返回。