- 时间:2020-10-27 15:58 编辑: 来源: 阅读:
- 扫一扫,手机访问
摘要:Prototype使用指南之enumerable.js
Enumerable是一个抽象对象(需要说明的是,javascript中并没有类的概念,所指的类也就是一个函数,继承一般指的是一个对象(父)将它的方法属性copy(通过Object.extend, copy的是引用)到子类(函数)的prototype属性(一个对象)中) Enumerable不能直接使用,它被很多枚举类型(Hash、Array、Range等)所继承,继承的类型都要实现一个_each方法,提供具体类型的枚举方法 Enumerable为其他子类提供了如下的方法:[b]each(iterator):[/b] iterator是一个函数对象, 这个方法调用具体类型的_each方法对自身包含的每个对象调用iterator,例如如果Enumerable具体指的是一个Array,eg: var a=[2,3,4], 则a.each(iterator)方法将依次调用iterator(2,0) ,iterator(3,1), iterator(4,3),其中第二个参数指的是索引。这个方法几乎在Enumerable中的每个方法中都要用到[b]eachSlice(number, iterator):[/b]将Enumerable类型对象每个每个按照number分开,例如[1,2,3,4,5].eachSlice(3)=>[[1,2,3],[4,5]], 没有提供iterator, 则iterator=Prototype.K: function(k){return k},Prototype中的很多iterator默认值都是这个,或者是Prototype.emptyFunction: function() {},其实实际上返回的是[iterator([1,2,3]),iterator([4,5])][b]all(iterator):[/b] 对Enumerable类型中的每个值调用iterator,如果其中有一个返回false,则返回false,否则返回true,相当于判断是否每个值执行iterator都是"true"[b]any(iterator):[/b] 跟all相反,判断是否每个值都是"false"(是否有一个值是true)[b]collect(iterator)/map:[/b] 对每个值调用iterator,将结果组成一个新的数组返回[b]detect(iterator)/find:[/b] 对每个值调用iterator,如果有一个不为false,则返回这个执行iterator后不为false的值(不是返回执行iterator后的值),相当于找出第一个真值[b]findAll(iterator)/select:[/b] 相当于detect, 但是找出所有的真值,返回一个数组[b]grep(pattern, iterator):[/b]返回所以符合pattern的值,iterator提供的话,则返回执行iterator的值[b]include(object)/member:[/b] 数组中是否包含object[b]inGroupsOf(number, fillWith):[/b] eachSlice的变异版本,按照number将对象分开,如果分开后的数组的最后一个值的length小于number, 则用fillwith填充, 例如[1,2,3,4,5].inGroupsOf(3)=>[[1,2,3],[4,5,null]][b]inject(memo, iterator):[/b] 注入[b]invoke(method):[/b] 调用[b]max(iterator):[/b] 最大值[b]min(iterator):[/b] 最小值[b]partition(iterator):[/b] 分离[b]pluck(property):[/b] 采集[b]reject(iterator):[/b] 不合格的产品, 于findAll相反[b]sortBy(iterator):[/b] 根据iterator排序,如果调用的对象是Array的话,直接调用内置的sort(iterator)就行了[b]toArray()/entries:[/b] 将调用对象的每个值组成一个数组返回[b]zip():[/b] 例如[2,3,4].zip([5,6,7])=>[[2,5],[3,6],[4,7]], 如果最后一个参数类型为function,将返回[iterator([2,5]),iterator([3,6]),iterator([4,7])],[b]inspect():[/b] Enumerable对象的字符串表示 NND的,原来Enumerable有这么多函数,感觉作者是不是学习Ruby太过了,把什么方法都往Prototype上挪,搞的我们学习的也辛苦,Prototype文件也变得越来越大,浪费带宽啊 唉,发现其中很多函数越解释越难懂,大家还是多多看看源代码理解吧,偶的文字表达能力真的不乍的,有的实在不知道怎么表达, 希望大家还是只是把本文当成一个不正规的参考,有什么问题还是看源代码理解,不然误导了你我可不负责啊