麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > 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);
  };
});

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: av成人在线免费观看 | 成人午夜精品久久久久久久蜜臀 | 亚洲第一成人av | 日韩黄色一级视频 | 草碰人人 | 龙床上的呻吟高h | 久久精品无码一区二区日韩av | 4399一级成人毛片 | 亚洲天堂ww| 黄视频免费在线 | 久草在线视频中文 | www.狠狠插.com| 天天看天天摸天天操 | 欧美一区黄色 | 久久精品久久精品国产大片 | 国产精品99久久99久久久二 | 欧美乱码精品一区 | 久久色播 | 毛片成人 | 免费视频www在线观看 | 黄网站免费观看视频 | 免费毛片观看 | 色猫av | 日韩色视频 | 成年人性视频 | 成人小视频免费在线观看 | 成人精品一区二区三区中文字幕 | 夜间福利网站 | 92看片淫黄大片欧美看国产片 | 羞羞视频免费观看入口 | 在线观看中文字幕av | 成人午夜免费福利 | 国产在线精品一区二区三区不卡 | 久草成人在线观看 | 97香蕉超级碰碰久久免费软件 | 国产免费人做人爱午夜视频 | 中日无线码1区 | 特级毛片a级毛片100免费 | 亚洲欧洲日产v特级毛片 | 精品亚洲夜色av98在线观看 | 日本高清无遮挡 |