亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > 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网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
黑人精品xxx一区| 精品久久香蕉国产线看观看亚洲| 欧美与欧洲交xxxx免费观看| 夜夜嗨av色综合久久久综合网| 日韩经典中文字幕在线观看| 国内精品久久久久影院 日本资源| 色噜噜国产精品视频一区二区| 国产丝袜一区二区三区免费视频| 成人激情综合网| 国产精品99久久久久久人| 亚洲成年人在线播放| 久久影院资源站| 91高清视频免费观看| 日韩美女视频中文字幕| 久久精品国产清自在天天线| 91av视频在线播放| 国产成人鲁鲁免费视频a| 亚洲第一福利视频| 青青草国产精品一区二区| 成人精品视频99在线观看免费| 亚洲欧美变态国产另类| 狠狠躁夜夜躁久久躁别揉| 日韩精品中文字幕在线观看| 国产亚洲xxx| 成人国产精品日本在线| 日韩av成人在线| 91亚洲va在线va天堂va国| 亚洲最新av网址| 成人午夜激情网| 久久精品国产一区二区三区| 91精品视频一区| 日韩久久午夜影院| 欧美激情综合色综合啪啪五月| 亚洲最新中文字幕| xxx一区二区| 久久久久一本一区二区青青蜜月| 国产亚洲精品久久久久久| 欧美日韩亚洲高清| 色老头一区二区三区| 欧美大尺度电影在线观看| 国模私拍一区二区三区| 亚洲国产精品久久久久| 91国语精品自产拍在线观看性色| 亚洲男人第一网站| 北条麻妃在线一区二区| 色妞色视频一区二区三区四区| 欧美日韩国产一区二区| 久久久久九九九九| 国产精品91免费在线| 亚洲少妇激情视频| 欧美大片在线看免费观看| 欧美成人全部免费| 日韩欧美大尺度| 色综合亚洲精品激情狠狠| 日韩精品在线第一页| 欧美日韩国产黄| 亚洲欧美综合区自拍另类| 91免费在线视频网站| 国产精品91免费在线| 国产91在线播放九色快色| 国产精品久久久久久久久久久不卡| 一本色道久久综合狠狠躁篇怎么玩| 欧美福利在线观看| 91欧美精品午夜性色福利在线| 日韩电影视频免费| 俺也去精品视频在线观看| 色一区av在线| 国产精品视频自在线| 久久久极品av| 成人亚洲综合色就1024| 亚洲精品999| 久久人人爽人人| 日韩电影在线观看中文字幕| 欧美日韩中文在线| 欧美另类极品videosbestfree| 亚洲bt欧美bt日本bt| 国产精品极品在线| 午夜精品久久久99热福利| 亚洲国产成人在线视频| 亚洲精品成人免费| 97视频在线观看网址| 一区二区三区黄色| 日韩欧美成人网| 亚洲免费av片| 国产九九精品视频| 成人女保姆的销魂服务| 亚洲男人的天堂在线播放| 日本欧美黄网站| 亚洲综合在线中文字幕| 亚洲一区精品电影| 亚洲精品黄网在线观看| 久久影视电视剧免费网站清宫辞电视| 国内外成人免费激情在线视频网站| 国产精品欧美一区二区| 亚洲成人性视频| 亚洲乱码一区av黑人高潮| 国产精品电影观看| 深夜福利一区二区| 成人黄色免费片| 色婷婷综合久久久久| 久久精品人人爽| 亚洲精品日韩激情在线电影| 91亚洲精品久久久| 日韩精品视频在线观看免费| 国产精品扒开腿做爽爽爽的视频| 日韩av电影院| 国产精品入口夜色视频大尺度| 亚洲天堂开心观看| 久国内精品在线| 欧美高清在线播放| 国产精品影片在线观看| 日本韩国欧美精品大片卡二| 国产成人在线精品| 日本精品性网站在线观看| 美女撒尿一区二区三区| 少妇高潮久久77777| 国产精品一区二区三区在线播放| 4p变态网欧美系列| 国产伦精品一区二区三区精品视频| 欧美激情一区二区三级高清视频| 91精品国产亚洲| 欧美野外猛男的大粗鳮| 日韩在线精品一区| 欧美老少配视频| 欧美精品videosex性欧美| 亚洲久久久久久久久久久| 亚洲在线免费看| 日日摸夜夜添一区| 成人黄色影片在线| 国产91精品不卡视频| 欧美精品精品精品精品免费| 亚洲无线码在线一区观看| 亚洲精品电影网在线观看| 91在线视频一区| 精品动漫一区二区| 一区二区三区美女xx视频| 国产精品18久久久久久首页狼| 国产国语刺激对白av不卡| 成人网页在线免费观看| 国产精品扒开腿做| 亚洲天堂日韩电影| 国产+成+人+亚洲欧洲| 国产精品99久久久久久人| 日韩精品在线免费播放| 色无极影院亚洲| 欧美风情在线观看| 91中文在线观看| 91色琪琪电影亚洲精品久久| 国产精品一久久香蕉国产线看观看| 456国产精品| 日韩亚洲欧美中文高清在线| 欧美性猛交xxxx富婆弯腰| 欧美专区日韩视频| 91免费看国产| 欧美黑人又粗大| 亚洲影视九九影院在线观看| 国产亚洲精品久久久久动| 日韩有码视频在线| 97人人做人人爱| 91精品久久久久久久| 国产精品毛片a∨一区二区三区|国| 97免费中文视频在线观看| 全色精品综合影院| 欧美激情视频网站|