从这篇起,在没有介绍到各类插件之前,后面将陆续介绍zepto对外暴露的核心方法。即$.fn={}里面的所有方法的介绍。会配合zepto的API进行介绍。
其实前面已经介绍了几个,如width,height,prepend等等,今天开始的是zepto源码里面,明确的封装在$.fn对象里面的方法。
本篇介绍的是与类数组(NodeList)操作相关的各种方法:
forEach,reduce,push,sort,splice,indexOf,concat,map,slice,toArray,each,filter,not
插上一句,关于$.fn对象最前面的两个属性
constructor:zepto.Z是为了确保zepto创建的对象,constructor都指向zepto.Z
length:0是为了解决在低版本ie中对象冒充时,ie浏览器不能提供的特性。
forEach,reduce,push,sort,splice,indexOf这6个函数,完全是调用ECMAScript中有关数组的原生函数,不做过多解释,需要更多了解的话,可以自行了解。
concat:
添加元素到一个Zepto对象集合形成一个新数组。如果参数是一个数组,那么这个数组中的元素将会合并到Zepto对象集合中。
这里有两个函数调用需要注意
value.toArray(),这个方法是在后面介绍了的,调用get方法直接将zepto对象转换为dom对象。
另外一个就是return concat,这个concat是前面定义的变量 concat = emptyArray.concat,是数组原生方法,千万不能与我们自定义的函数concat相混淆。
slice:
提取这个数组array
的子集,从start
开始,如果给定end
,提取从从start
开始到end
结束的元素,但是不包含end
位置的元素。
调用数组原生函数,提取nodeList的子集,然后包装成zepto对象返回。这里函数内部的slice也是前面定义的变量slice = emptyArray.slice.
filter:
过滤对象集合,返回对象集合中满足css选择器slelctor的项。如果参数为一个函数,函数返回有实际值得时候,元素才会被返回。在函数中, this
关键字指向当前的元素。
如果传入的参数为函数,则调用not方法实现,this.not(this.not(selector)),通俗点讲:就是负负得正,所以使用了两个this.not
非函数情况下,调用zepto.matches判断当前的元素是否匹配传入的参数,如果匹配就返回。
not:
过滤当前对象集合,获取一个新的对象集合,它里面的元素不能匹配css选择器。如果另一个参数为Zepto对象集合,那么返回的新Zepto对象中的元素都不包含在该参数对象中。如果参数是一个函数。仅仅包含函数执行为false值得时候的元素,函数的 this
关键字指向当前循环元素。
如果传入的参数为函数,则对匹配的zepto对象(如:$('li'))遍历,调用传入的函数,如果selector.call(this, idx)==false时,表示,当前遍历到的选项不符合selector函数,则把当前项存入数组nodes。
如果传入的参数不是函数,正好可以利用与not函数功能完全相反的filter函数来实现,获得能够匹配选择器的选项赋值给excludes,遍历选取的zepto对象(如:$('li')),如果
excludes中不存在遍历到的当前的选项el,则将el存入数组nodes,最后将nodes包装成zepto对象并返回出来。
map:
遍历对象集合中的所有元素。通过遍历函数返回值形成一个新的集合对象。在遍历函数中this
关键之指向当前循环的项(遍历函数中的第二个参数)。
遍历中返回 null
和undefined
,遍历将结束。
基本上就是实现了原生数组函数map的zepto对象包装,重点是会形成新的数组返回。
each:
遍历一个对象集合每个元素。在迭代函数中,this
关键字指向当前项(作为函数的第二个参数传递)。如果迭代函数返回 false
,遍历结束。
这个主要是在函数内部对遍历到的元素进行处理,不会返回新的数组,return this的目的是保持连缀。
对类数组相关方法的实现,利用到了很多数组原生函数,所以如果需要对这块进行更深刻的了解的话,可以更深入的了解一下数组的原生函数。