国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

javascript利用apply和arguments復用方法

2019-11-20 21:35:28
字體:
來源:轉載
供稿:網友

首先,有個單例對象,它上面掛了很多靜態工具方法。其中有一個是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);
  };
});

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 双桥区| 东丽区| 上林县| 永康市| 景德镇市| 泊头市| 囊谦县| 沭阳县| 黑河市| 花莲县| 公安县| 会泽县| 都安| 固始县| 大姚县| 手机| 卢龙县| 正镶白旗| 长沙县| 靖江市| 安图县| 永善县| 唐河县| 漾濞| 缙云县| 大邑县| 陆川县| 大宁县| 商水县| 荆门市| 波密县| 比如县| 达日县| 郴州市| 讷河市| 贵德县| 唐海县| 吉水县| 兖州市| 乌拉特后旗| 洪洞县|