javascript利用apply和arguments复用方法

日期:2019-09-13编辑作者:关于计算机

首先,有个单例对象,它下边挂了累累静态工具方法。当中有三个是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 浏览器决断 绑定事件 arguments 转变数组 数组遍历
  • javascript arguments 传递给函数的蕴藏参数
  • javascript下arguments,caller,callee,call,apply示例及领悟
  • javascript函数中的arguments参数
  • javascript下利用arguments实现string.format函数
  • 理解Javascript_14_函数方式参数与arguments
  • javascript奇异的arguments分析
  • JavaScript arguments 多参传值函数
  • javaScript arguments 对象使用介绍
  • javascript内置对象arguments详解
  • JavaScript中怎么样通过arguments对象达成目的的重载
  • JavaScript中利用arguments得到函数字传送参个数实例
  • JavaScript的arguments对象应用示范
  • javascript arguments使用示例
  • 跟自家上学javascript的arguments对象

本文由今晚最快开奖现场直播发布于关于计算机,转载请注明出处:javascript利用apply和arguments复用方法

关键词:

jQuery中even选用器的定义和用法

本文实例呈报了jQuery中even选择器的概念和用法。共享给我们供我们参谋。具体深入分析如下: jQuery中even选用器的概...

详细>>

js对象聚集,创造js对象和js类的方法汇总

代码很简单,就不多废话了。 创建js对象和js类的方法汇总,js对象汇总 代码很简单,就不多废话了。 复制代码 代码...

详细>>

轻松创建nodejs服务器

本节大家将完成,客商上传图片,并将该图片在浏览器中展现出来。 自在创制nodejs服务器(10):管理上传图片,n...

详细>>

运用javascript实现Iframe自适应中度

方法一: 那边介绍八个最棒轻巧的办法,不用写什么推断浏览器高度、宽度啥的。 复制代码 代码如下: 上面包车型地...

详细>>