Pertama, ada objek tunggal dengan banyak metode alat statis yang digantung di sana. Salah satunya adalah masing-masing, yang digunakan untuk melintasi array atau objek.
Copy kode kodenya sebagai berikut:
var nativeForEach = [].forEach
var nativeMap = [].peta
varutil = {
masing-masing: fungsi (obj, iterator, konteks) {
jika (obj == null) kembali
if (nativeForEach && obj.forEach === nativeForEach) {
obj.forEach(iterator, konteks)
} else if (obj.panjang === +obj.panjang) {
for (var i = 0; i < obj.panjang; i++) {
if (iterator.call(obj[i] || konteks, obj[i], i, obj) === true) kembali
}
} kalau tidak {
untuk (var k dalam objek) {
if (iterator.call(obj[k] || konteks, obj[k], k, obj) === true) kembali
}
}
},
peta: fungsi(obj, iterator, konteks) {
hasil var = []
if (obj == null) mengembalikan hasil
if (nativeMap && obj.map === nativeMap) kembalikan obj.map(iterator, konteks)
ini.setiap(obj, fungsi(val, i, coll) {
hasil[i] = iterator.call(konteks, val, i, coll)
})
mengembalikan hasil
}
}
Ada juga fungsi utilitas seperti every, some, dll. yang beroperasi pada koleksi (Array, Hash). Gunakan metode util.xx saat menggunakannya.
Jika kelas koleksi didefinisikan, ada kumpulan data di dalam kelas ini.
Copy kode kodenya sebagai berikut:
Koleksi fungsi(data) {
ini.data = data ||.
// beberapa properti lainnya
// ini.xxx = yyy
}
Koleksi.prototipe = {
// beberapa metode
}
Anda dapat dengan mudah menyalin metode util ke kelas koleksi, seperti
Copy kode kodenya sebagai berikut:
fungsi copyMethod(clazz, obj) {
untuk (metode var di obj) {
clazz.prototipe[metode] = fungsi() {
var args = [].slice.call(argumen)
var target = ini.data
args.unshift(target)
obj[metode].apply(obj, args)
}
}
}
copyMethod(Koleksi, kegunaan)
Setelah menyalin dengan cara ini, instance Koleksi akan memiliki metode pada util, dan objek koleksi (parameter pertama) yang dioperasikan oleh util adalah this.data dari Koleksi. Anda dapat langsung melintasi this.data sebagai berikut.
Copy kode kodenya sebagai berikut:
var coll = Koleksi baru([10, 20, 30])
// melintasi
coll.each(fungsi(k) {
konsol.log(k)
})
// beroperasi
var arr = coll.map(fungsi(k) {
kembalik-5
})
konsol.log(arr) // 5, 15, 25
Pola ini digunakan di banyak perpustakaan sumber terbuka, seperti jQuery, yang $.each/$.mapnya mudah disalin ke $().each/$().map.
Contoh lainnya adalah Backbone, yang _.each/_.map/_.every/_.chain-nya (dan masih banyak lagi) disalin ke prototipe Koleksi.
Copy kode kodenya sebagai berikut:
// Garis bawahi metode yang ingin kita terapkan pada Koleksi.
// 90% kegunaan inti dari Backbone Collections benar-benar diimplementasikan
// di sini:
metode var = ['forEach', 'masing-masing', 'peta', 'kumpulkan', 'kurangi', 'lipat',
'menyuntikkan', 'reduceRight', 'foldr', 'find', 'detect', 'filter', 'select',
'tolak', 'setiap', 'semua', 'sebagian', 'apa saja', 'sertakan', 'berisi', 'panggil',
'max', 'min', 'toArray', 'size', 'first', 'head', 'take', 'initial', 'rest',
'ekor', 'jatuhkan', 'terakhir', 'tanpa', 'perbedaan', 'indexOf', 'shuffle',
'lastIndexOf', 'isEmpty', 'rantai'];
// Gabungkan setiap metode Garis Bawah sebagai proxy ke `Koleksi#model`.
_.setiap(metode, fungsi(metode) {
Koleksi.prototipe[metode] = fungsi() {
var args = irisan.panggilan(argumen);
args.unshift(ini.model);
kembalikan _[metode].berlaku(_, args);
};
});
Selain itu, metode praktis untuk operasi objek seperti _.keys / _.values / _.pairs / _.invert / _.pick disalin ke Backbone.Model (baru di 1.0)
Copy kode kodenya sebagai berikut:
var modelMethods = ['kunci', 'nilai', 'pasangan', 'balikkan', 'pilih', 'hilangkan'];
// Gabungkan setiap metode Garis Bawah sebagai proksi ke `Model#attributes`.
_.setiap(modelMetode, fungsi(metode) {
Model.prototipe[metode] = fungsi() {
var args = irisan.panggilan(argumen);
args.unshift(ini.atribut);
kembalikan _[metode].berlaku(_, args);
};
});