Enumerable是一個抽象對象(需要說明的是,javascript中并沒有類的概念,所指的類也就是一個函數,繼承一般指的是一個對象(父)將它的方法屬性copy(通過Object.extend, copy的是引用)到子類(函數)的prototype屬性(一個對象)中) Enumerable不能直接使用,它被很多枚舉類型(Hash、Array、Range等)所繼承,繼承的類型都要實現一個_each方法,提供具體類型的枚舉方法 Enumerable為其他子類提供了如下的方法: each(iterator): iterator是一個函數對象, 這個方法調用具體類型的_each方法對自身包含的每個對象調用iterator,例如如果Enumerable具體指的是一個Array,eg: var a=[2,3,4], 則a.each(iterator)方法將依次調用iterator(2,0) ,iterator(3,1), iterator(4,3),其中第二個參數指的是索引。這個方法幾乎在Enumerable中的每個方法中都要用到 eachSlice(number, iterator):將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])] all(iterator): 對Enumerable類型中的每個值調用iterator,如果其中有一個返回false,則返回false,否則返回true,相當于判斷是否每個值執行iterator都是"true" any(iterator): 跟all相反,判斷是否每個值都是"false"(是否有一個值是true) collect(iterator)/map: 對每個值調用iterator,將結果組成一個新的數組返回 detect(iterator)/find: 對每個值調用iterator,如果有一個不為false,則返回這個執行iterator后不為false的值(不是返回執行iterator后的值),相當于找出第一個真值 findAll(iterator)/select: 相當于detect, 但是找出所有的真值,返回一個數組 grep(pattern, iterator):返回所以符合pattern的值,iterator提供的話,則返回執行iterator的值 include(object)/member: 數組中是否包含object inGroupsOf(number, fillWith): eachSlice的變異版本,按照number將對象分開,如果分開后的數組的最后一個值的length小于number, 則用fillwith填充, 例如[1,2,3,4,5].inGroupsOf(3)=>[[1,2,3],[4,5,null]] inject(memo, iterator): 注入 invoke(method): 調用 max(iterator): 最大值 min(iterator): 最小值 partition(iterator): 分離 pluck(property): 采集 reject(iterator): 不合格的產品, 于findAll相反 sortBy(iterator): 根據iterator排序,如果調用的對象是Array的話,直接調用內置的sort(iterator)就行了 toArray()/entries: 將調用對象的每個值組成一個數組返回 zip(): 例如[2,3,4].zip([5,6,7])=>[[2,5],[3,6],[4,7]], 如果最后一個參數類型為function,將返回[iterator([2,5]),iterator([3,6]),iterator([4,7])], inspect(): Enumerable對象的字符串表示 NND的,原來Enumerable有這么多函數,感覺作者是不是學習Ruby太過了,把什么方法都往Prototype上挪,搞的我們學習的也辛苦,Prototype文件也變得越來越大,浪費帶寬啊 唉,發現其中很多函數越解釋越難懂,大家還是多多看看源代碼理解吧,偶的文字表達能力真的不乍的,有的實在不知道怎么表達, 希望大家還是只是把本文當成一個不正規的參考,有什么問題還是看源代碼理解,不然誤導了你我可不負責啊