まず、多数の静的ツール メソッドがハングされたシングルトン オブジェクトがあります。そのうちの 1 つは each で、配列またはオブジェクトを走査するために使用されます。
次のようにコードをコピーします。
varnativeForEach = [].forEach
varnativeMap = [].map
varutil = {
各: 関数 (obj、イテレータ、コンテキスト) {
if (obj == null) が返される
if (nativeForEach && obj.forEach ===nativeForEach) {
obj.forEach(イテレータ、コンテキスト)
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
}
} それ以外 {
for (obj の var k) {
if (iterator.call(obj[k] || context, obj[k], k, obj) === true) return
}
}
}、
マップ: 関数(obj, イテレータ, コンテキスト) {
var 結果 = []
if (obj == null) 結果を返す
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)
})
結果を返す
}
}
コレクション (配列、ハッシュ) を操作する、every、some などのユーティリティ関数もあります。使用する場合はutil.xxメソッドを使用してください。
コレクション クラスが定義されている場合、このクラス内にコレクション データが存在します。
次のようにコードをコピーします。
関数コレクション(データ) {
this.data = データ || []
// 他のプロパティ
// this.xxx = yyy
}
コレクション.プロトタイプ = {
// 何らかのメソッド
}
util のメソッドをコレクション クラスに簡単にコピーできます。
次のようにコードをコピーします。
関数 copyMethod(clazz, obj) {
for (obj の var メソッド) {
clazz.prototype[メソッド] = function() {
var args = [].slice.call(引数)
var target = this.data
args.unshift(ターゲット)
obj[メソッド].apply(obj, args)
}
}
}
copyMethod(コレクション, util)
このようにコピーすると、Collection インスタンスは util 上のメソッドを持つことになり、util が操作するコレクションオブジェクト (第一引数) は Collection の this.data になります。次のように this.data を直接走査できます。
次のようにコードをコピーします。
var coll = 新しいコレクション([10, 20, 30])
// トラバース
coll.each(関数(k) {
コンソール.ログ(k)
})
// 操作する
var arr = coll.map(function(k) {
リターンク-5
})
console.log(arr) // 5、15、25
このパターンは、jQuery などの多くのオープン ソース ライブラリで使用されており、その $.each/$.map は $().each/$().map にコピーされるのが便利です。
もう 1 つの例は Backbone で、その _.each/_.map/_.every/_.chain (およびその他の多く) が Collection プロトタイプにコピーされます。
次のようにコードをコピーします。
// コレクションに実装するメソッドに下線を付けます。
// バックボーン コレクションの中核となる有用性の 90% が実際に実装されています
// ここにあります:
var メソッド = ['forEach', 'each', 'map', 'collect', 'reduce', 'foldl',
'inject'、'reduceRight'、'foldr'、'find'、'detect'、'filter'、'select'、
'拒否'、'すべて'、'すべて'、'一部'、'任意'、'含む'、'含む'、'呼び出し'、
'max'、'min'、'toArray'、'size'、'first'、'head'、'take'、'initial'、'rest'、
'テール'、'ドロップ'、'最後'、'なし'、'差分'、'indexOf'、'シャッフル'、
'lastIndexOf'、'isEmpty'、'chain'];
// 各 Underscore メソッドを `Collection#models` へのプロキシとして混ぜます。
_.each(メソッド, 関数(メソッド) {
Collection.prototype[メソッド] = function() {
var args = スライス.コール(引数);
args.unshift(this.models);
return _[メソッド].apply(_, args);
};
});
さらに、_.keys / _.values / _.pairs / _.invert / _.pick などのオブジェクト操作の実用的なメソッドが Backbone.Model (1.0 の新機能) にコピーされます。
次のようにコードをコピーします。
var modelMethods = ['キー', '値', 'ペア', '反転', '選択', '省略'];
// 各 Underscore メソッドを `Model#attributes` へのプロキシとして混ぜます。
_.each(モデルメソッド, 関数(メソッド) {
Model.prototype[メソッド] = function() {
var args = スライス.コール(引数);
args.unshift(this.attributes);
return _[メソッド].apply(_, args);
};
});