首先,有个单例对象,它上面挂了很多静态工具方法。其中有一个是each,用来遍历数组或对象。
var nativeForEach = [].forEach var nativeMap = [].map var util = { each: function (obj, iterator, context) { if (obj == null) return if (nativeForEach && obj.forEach === nativeForEach) { obj.forEach(iterator, context) } else if ( obj.length === +obj.length ) { for (var i = 0; i < obj.length; i++) { if (iterator.call(obj[i] || context, obj[i], i, obj) === true) return } } else { for (var k in obj) { if (iterator.call(obj[k] || context, obj[k], k, obj) === true) return } } }, map: function(obj, iterator, context) { var results = [] if (obj == null) return results if (nativeMap && obj.map === nativeMap) return obj.map(iterator, context) this.each(obj, function(val, i, coll) { results[i] = iterator.call(context, val, i, coll) }) return results } }
还有诸如every、some等对集合(Array,Hash)操作的工具函数。使用时采用util.xx方式。
如果定义了一个集合类,这个类内部有集合数据。
function Collection(data) { this.data = data || [] // some other property // this.xxx = yyy } Collection.prototype = { // some method }
可以很方便的把util上的方法拷贝到集合类上,如
function copyMethod(clazz, obj) { for (var method in obj) { clazz.prototype[method] = function() { var args = [].slice.call(arguments) var target = this.data args.unshift(target) obj[method].apply(obj, args) } } } copyMethod(Collection, util)
这样拷贝后,Collection的实例就有了util上的方法,util操作的集合对象(第一个参数)就是Collection的this.data。如下直接可以遍历this.data了。
var coll = new Collection([10, 20, 30]) // 遍历 coll.each(function(k) { console.log(k) }) // 操作 var arr = coll.map(function(k) { return k - 5 }) console.log(arr) // 5, 15, 25
这种模式在很多开源库中使用,比如jQuery,它的 $.each/$.map 很方便的拷贝到了 $().each/$().map。
又如Backbone,它的 _.each/_.map/_.every/_.chain (还有很多)都拷贝到了 Collection的原型上。
// Underscore methods that we want to implement on the Collection. // 90% of the core usefulness of Backbone Collections is actually implemented // right here: var methods = ['forEach', 'each', 'map', 'collect', 'reduce', 'foldl', 'inject', 'reduceRight', 'foldr', 'find', 'detect', 'filter', 'select', 'reject', 'every', 'all', 'some', 'any', 'include', 'contains', 'invoke', 'max', 'min', 'toArray', 'size', 'first', 'head', 'take', 'initial', 'rest', 'tail', 'drop', 'last', 'without', 'difference', 'indexOf', 'shuffle', 'lastIndexOf', 'isEmpty', 'chain']; // Mix in each Underscore method as a proxy to `Collection#models`. _.each(methods, function(method) { Collection.prototype[method] = function() { var args = slice.call(arguments); args.unshift(this.models); return _[method].apply(_, args); }; });
又有,把 _.keys / _.values / _.pairs / _.invert / _.pick 等对对象操作的实用方法拷贝了 Backbone.Model上 (1.0新增)
var modelMethods = ['keys', 'values', 'pairs', 'invert', 'pick', 'omit']; // Mix in each Underscore method as a proxy to `Model#attributes`. _.each(modelMethods, function(method) { Model.prototype[method] = function() { var args = slice.call(arguments); args.unshift(this.attributes); return _[method].apply(_, args); }; });
相关推荐
主要介绍了javascript利用apply和arguments复用方法,有需要的朋友可以参考一下
主要介绍了JS中call/apply、arguments、undefined/null方法详解的相关资料,需要的朋友可以参考下
代码如下: function test(){ //将参数转为一个数组 var args = Array.prototype.slice.apply(arguments); alert(args); } arguments在JavaScript语法中是函数特有的一个对象属性(Arguments对象),用来...
js中arguments,caller,callee,apply的用法小结.docx
一、call和apply的说明 1、call,apply都属于Function.prototype的一个方法,它是JavaScript引擎内在实现的,因为属于Function.prototype,所以每个Function对象实例(就是每个方法)都有call,apply属性。既然作为...
NULL 博文链接:https://fkshl.iteye.com/blog/1178391
在函数定义时没有形参名称时,向函数传递参数的使用方法。 实例演示了arguments对象的使用方法。
JS:arguments
JavaScript中arguments的使用方法详解 js这是一门弱语言,不像其他语言如c,java等,有严格的规范, 所以现在也流传着一种说法,js本来就不是一种语言; 说回arguments,它是js中函数内置的一个对象,而执行函数...
Arguments and results by James Noble
A Rulebook for Arguments (3rd Edition)
理解Javascript函数形式参数与arguments
前端开源库-arguments-extended参数扩展,用于处理参数对象的实用程序
一、arguments使用方法 通过方括号语法访问每一个元素 var fun = function(one) { console.log(arguments[0]); console.log(arguments[1]); console.log(arguments[2]); } fun(1, 2, 3) // 1 // 2 // 3 通过...
Arguments and Results 参数,资源
我首先从网上查到关于apply和call的定义,然后用示例来解释这两个方法的意思和如何去用. apply:方法能劫持另外一个对象的方法,继承另外一个对象的属性. Function.apply(obj,args)方法能接收两个参数 obj:这个对象将...
前言 最近在看JavaScript设计模式,... var ctx = [].shift.apply(arguments) return this.apply(ctx, arguments) } 二、apply实现bind Function.prototype.bind = function () { var ctx = [].shift.apply(argume
Function input arguments always precede output arguments