`

【prototype学习】prototype源码分析—enumerable

阅读更多
js 代码

 

 
  1. var $break    = new Object();   //表示break的对象 可以对比java的exception的使用
  2. var $continue = new Object();   //表示continue的对象 可以对比java的exception的使用
  3.   
  4. var Enumerable = {   
  5.   each: function(iterator) {   //执行_each函数
  6.     var index = 0;   
  7.     try {   
  8.       this._each(function(value) {   
  9.         try {   
  10.           iterator(value, index++);   
  11.         } catch (e) {   
  12.           if (e != $continuethrow e;   
  13.         }   
  14.       });   
  15.     } catch (e) {   
  16.       if (e != $breakthrow e;   
  17.     }   
  18.   },   
  19.   //boolean   返回函数遍历执行后的总结果 如果每次执行都返回非假则得到true
  20.   all: function(iterator) {   
  21.     var result = true;   
  22.     this.each(function(value, index) {   
  23.       result = result && !!(iterator || Prototype.K)(value, index);   
  24.       if (!result) throw $break;   
  25.     });   
  26.     return result;   
  27.   },   
  28.    //boolean  返回函数遍历执行后的总结果 只要遇到执行返回非假则得到true  
  29.   any: function(iterator) {   
  30.     var result = true;   
  31.     this.each(function(value, index) {   
  32.       if (result = !!(iterator || Prototype.K)(value, index))    
  33.         throw $break;   
  34.     });   
  35.     return result;   
  36.   },   
  37.   //result array 把函数遍历执行后的结果放进一个数组返回    
  38.   collect: function(iterator) {   
  39.     var results = [];   
  40.     this.each(function(value, index) {   
  41.       results.push(iterator(value, index));   
  42.     });   
  43.     return results;   
  44.   },   
  45.   //   返回any函数中执行非假的那个参数value
  46.   detect: function (iterator) {   
  47.     var result;   
  48.     this.each(function(value, index) {   
  49.       if (iterator(value, index)) {   
  50.         result = value;   
  51.         throw $break;   
  52.       }   
  53.     });   
  54.     return result;   
  55.   },   
  56.   //   针对collect函数进行过滤 只有执行非假的函数参数value才进入结果数组
  57.   findAll: function(iterator) {   
  58.     var results = [];   
  59.     this.each(function(value, index) {   
  60.       if (iterator(value, index))   
  61.         results.push(value);   
  62.     });   
  63.     return results;   
  64.   },   
  65.   //   针对collect函数进行过滤 只有执行value符合pattern,才把执行结果进入结果数组   
  66.   grep: function(pattern, iterator) {   
  67.     var results = [];   
  68.     this.each(function(value, index) {   
  69.       var stringValue = value.toString();   
  70.       if (stringValue.match(pattern))   
  71.         results.push((iterator || Prototype.K)(value, index));   
  72.     })   
  73.     return results;   
  74.   },   
  75.   //boolean 是否为value的数组的成员   
  76.   include: function(object) {   
  77.     var found = false;   
  78.     this.each(function(value) {   
  79.       if (value == object) {   
  80.         found = true;   
  81.         throw $break;   
  82.       }   
  83.     });   
  84.     return found;   
  85.   },   
  86.   //通过注入inject 累及运算结果进行  累计运算    
  87.   inject: function(memo, iterator) {   
  88.     this.each(function(value, index) {   
  89.       memo = iterator(memo, value, index);   
  90.     });   
  91.     return memo;   
  92.   },   
  93.   //传递 函数+需要的参数 进行遍历执行 并返回执行结果集   
  94.   invoke: function(method) {   
  95.     var args = $A(arguments).slice(1);   
  96.     return this.collect(function(value) {   
  97.       return value[method].apply(value, args);   
  98.     });   
  99.   },   
  100.   // 取函数遍历执行后 最大的返回值   
  101.   max: function(iterator) {   
  102.     var result;   
  103.     this.each(function(value, index) {   
  104.       value = (iterator || Prototype.K)(value, index);   
  105.       if (value >= (result || value))   
  106.         result = value;   
  107.     });   
  108.     return result;   
  109.   },   
  110.   // 取函数遍历执行后 最小的返回值   
  111.   min: function(iterator) {   
  112.     var result;   
  113.     this.each(function(value, index) {   
  114.       value = (iterator || Prototype.K)(value, index);   
  115.       if (value <= (result || value))   
  116.         result = value;   
  117.     });   
  118.     return result;   
  119.   },   
  120.   //把执行结果按照true 和 非true 作为2维数组返回   
  121.   partition: function(iterator) {   
  122.     var trues = [], falses = [];   
  123.     this.each(function(value, index) {   
  124.       ((iterator || Prototype.K)(value, index) ?    
  125.         trues : falses).push(value);   
  126.     });   
  127.     return [trues, falses];   
  128.   },   
  129. //  遍历数组取每个元素的该属性值放进结果数组返回   
  130.   pluck: function(property) {   
  131.     var results = [];   
  132.     this.each(function(value, index) {   
  133.       results.push(value[property]);   
  134.     });   
  135.     return results;   
  136.   },   
  137.   //返回遍历执行函数iterator结果非真的元素的结合   
  138.   reject: function(iterator) {   
  139.     var results = [];   
  140.     this.each(function(value, index) {   
  141.       if (!iterator(value, index))   
  142.         results.push(value);   
  143.     });   
  144.     return results;   
  145.   },   
  146.   //返回排序函数执行后的排序结果集   
  147.   sortBy: function(iterator) {   
  148.     return this.collect(function(value, index) {   
  149.       return {value: value, criteria: iterator(value, index)};   
  150.     }).sort(function(left, right) {   
  151.       var a = left.criteria, b = right.criteria;   
  152.       return a < b ? -1 : a > b ? 1 : 0;   
  153.     }).pluck('value');   
  154.   },   
  155.   //可遍历集合转换成js数组   
  156.   toArray: function() {   
  157.     return this.collect(Prototype.K);   
  158.   },   
  159.   //zip压缩   
  160.   zip: function() {   
  161.     var iterator = Prototype.K, args = $A(arguments);   
  162.     if (typeof args.last() == 'function')   
  163.       iterator = args.pop();   
  164.   
  165.     var collections = [this].concat(args).map($A);   
  166.     return this.map(function(value, index) {   
  167.       iterator(value = collections.pluck(index));   
  168.       return value;   
  169.     });   
  170.   },   
  171.   //查看 类似tostring   
  172.   inspect: function() {   
  173.     return '#this.toArray().inspect() + '>';   
  174.   }   
  175. }   
  176.   
  177. Object.extend(Enumerable, {   
  178.   map:     Enumerable.collect,   
  179.   find:    Enumerable.detect,   
  180.   select:  Enumerable.findAll,   
  181.   member:  Enumerable.include,   
  182.   entries: Enumerable.toArray   
  183. });   

 

 

待完善,欢迎指点、意见、建议。

分享到:
评论

相关推荐

    Prototype Enumerable对象 学习第1/2页

    【Prototype Enumerable对象】是Prototype框架的核心组成部分,它提供了一系列用于枚举操作的实用方法,即处理集合对象的方法。Enumerable本身并不是一个独立使用的对象,而是一个模块,设计用于与其他对象混合...

    Prototype源码浅析 Enumerable部分(二)

    但是,为了保持兼容性,Prototype的源码并未直接使用原生方法,而是自己实现了整个Enumerable模块,确保能在各种环境下工作。 此外,Enumerable中还有一些其他重要的方法,如`all`, `any`, 和 `include`。这三个...

    Prototype源码浅析 Enumerable部分之each方法

    为了使`Enumerable`能够应用于不同的对象,Prototype库中`Enumerable`的`each`方法实际上会调用对象自身的`_each`方法,这样,任何继承或混合了`Enumerable`的对象都需要提供`_each`来执行实际的迭代。例如,我们...

    prototype demo

    通过这个Prototype demo,开发者可以学习到如何利用Prototype库来增强JavaScript的原生对象,提升代码的可读性和可维护性,并掌握基于Prototype的Ajax操作,提高Web应用的用户体验。同时,结合CSS文件,可以了解前端...

    Prototype使用指南之enumerable.js

    在JavaScript的世界里,`Prototype`库提供了...虽然`Prototype`库中的方法众多,可能会增加学习曲线,但对于复杂的编程任务来说,这些工具提供了极大的便利性。建议深入研究源代码,以更直观地理解这些方法的工作原理。

    前端开源库-node-enumerable

    通过查看"node-enumerable-master"压缩包中的源码,开发者可以深入了解每个方法的实现原理,学习如何优雅地扩展JavaScript原生类型,以及如何利用TypeScript编写高质量的代码。 总结来说,"node-enumerable" 是一...

    Prototype学习资料

    ### Prototype学习资料:深入解析与应用 #### 引言 Prototype框架自问世以来,便以其卓越的性能和简便的操作在JavaScript开发领域占据了重要的地位。它不仅简化了动态Web应用程序的开发流程,还提供了丰富的功能,...

    js框架prototype-1.6.0.3.js

    JavaScript框架是Web开发中不可或缺的一部分,它为开发者提供了一种标准化的方法来组织和编写JavaScript代码,使得代码更易于维护和扩展。...学习并熟练掌握Prototype,将使你能够在Web开发中游刃有余。

    通过Enumerable实现线程控制(源码 更新)

    通过深入理解和使用这个项目,开发者可以学习到如何在C#中实现高效的线程控制,以及如何利用异步编程模型来提高应用程序的响应性和性能。同时,对于函数超时的处理也是提升程序健壮性的重要一环。通过实践和调试,...

    prototype1.4及文档

    **原型库Prototype 1.4详解** Prototype是一个广泛使用的...它的文档详细且易于理解,是学习和使用Prototype的宝贵资源。通过熟练掌握Prototype 1.4,开发者可以提高代码质量,减少兼容性问题,提升开发效率。

    prototype1.6.0.3.rar

    除了上述功能,Prototype还包含了一些实用工具,如Enumerable模块中的各种集合操作方法,Object.extend()用于对象合并,以及Hash类用于键值对存储等。 综上所述,Prototype 1.6.0.3版本通过“prototypejs.js”文件...

    Prototype-2.pdf

    通过对`Element`、`Array`、`Enumerable`、`Function`和`Number`等对象的方法的学习,开发人员可以更好地掌握如何使用Prototype来提升JavaScript编程的能力,从而构建出更加强大和灵活的Web应用程序。此外,通过参加...

    Prototype框架详解

    8. **Enumerable类**:类似于Java中的List对象,提供了一套迭代和操作集合的方法,如`each(iterator)`,可以遍历任何实现了Enumerable接口的对象,执行传入的迭代器函数。 Prototype框架通过这些功能极大地提升了...

    prototype 中文教程PDF

    对于那些刚开始接触 prototype.js 的用户来说,可能已经注意到该库的文档支持相对有限,因此深入研究其源码和实际应用中的探索是学习过程的重要组成部分。 #### 二、一些实用的函数 这一章节主要介绍了一些常用的...

    Developer Notes for prototype.doc

    Prototype 还定义了一些新的对象和类,包括但不限于 PeriodicalExecuter、Prototype、Enumerable、Hash、ObjectRange、Class、Ajax、Ajax.Responders、Ajax.Base、Ajax.Request、options argument object、Ajax....

    Recursively Enumerable Sets and Degrees(Soare)

    Recursively Enumerable Sets and Degrees by Rovert I. Soare。递归论的书籍,Soare的,从djvu转过来的,有可能有误。经典的教材

    prototype 中文API

    `prototype.js` 引入了枚举(Enumerable)的概念,它提供了一套用于迭代和处理数组或集合的方法,类似于Ruby语言中的风格,包括`each`, `map`, `select`等,极大地提高了代码的可读性和效率。 #### 五、`prototype....

Global site tag (gtag.js) - Google Analytics