javascript利用apply和arguments復(fù)用方法
首先,有個單例對象,它上面掛了很多靜態(tài)工具方法。其中有一個是each,用來遍歷數(shù)組或?qū)ο蟆?/P>
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)操作的工具函數(shù)。使用時采用util.xx方式。
如果定義了一個集合類,這個類內(nèi)部有集合數(shù)據(jù)。
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操作的集合對象(第一個參數(shù))就是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 轉(zhuǎn)換數(shù)組 數(shù)組遍歷
- javascript arguments 傳遞給函數(shù)的隱含參數(shù)
- javascript下arguments,caller,callee,call,apply示例及理解
- javascript函數(shù)中的arguments參數(shù)
- javascript下利用arguments實現(xiàn)string.format函數(shù)
- 理解Javascript_14_函數(shù)形式參數(shù)與arguments
- javascript奇異的arguments分析
- JavaScript arguments 多參傳值函數(shù)
- javaScript arguments 對象使用介紹
- javascript內(nèi)置對象arguments詳解
- JavaScript中如何通過arguments對象實現(xiàn)對象的重載
- JavaScript中使用arguments獲得函數(shù)傳參個數(shù)實例
- JavaScript的arguments對象應(yīng)用示例
- javascript arguments使用示例
- 跟我學(xué)習(xí)javascript的arguments對象
相關(guān)文章
javascript類型系統(tǒng)_正則表達(dá)式RegExp類型詳解
下面小編就為大家?guī)硪黄猨avascript類型系統(tǒng)_正則表達(dá)式RegExp類型詳解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-06-06JavaScript三種綁定事件方式及相互之間的區(qū)別分析
這篇文章主要介紹了JavaScript三種綁定事件方式及相互之間的區(qū)別,結(jié)合具體實例形式分析了javascript事件綁定方式的基本實現(xiàn)方法與相互之間的區(qū)別,需要的朋友可以參考下2017-01-01Javascript中Cookie的獲取和保存應(yīng)用案例
這篇文章主要給大家介紹了關(guān)于Javascript中Cookie的獲取和保存應(yīng)用的相關(guān)資料,Cookie是直接存儲在瀏覽器中的一小串?dāng)?shù)據(jù),文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-09-09JavaScript實現(xiàn)字符串與日期的互相轉(zhuǎn)換及日期的格式化
這篇文章主要介紹了JavaScript實現(xiàn)字符串與日期的互相轉(zhuǎn)換及日期的格式化的方法,這里格式化使用的是正則表達(dá)式來替換日期后進行格式化,需要的朋友可以參考下2016-03-03