ประการแรก มีออบเจ็กต์ซิงเกิลตันที่มีวิธีเครื่องมือคงที่มากมายติดอยู่ หนึ่งในนั้นคือแต่ละอัน ซึ่งใช้ในการสำรวจอาร์เรย์หรืออ็อบเจ็กต์
คัดลอกรหัสรหัสดังต่อไปนี้:
var NativeForEach = [].forEach
var NativeMap = [].แผนที่
วารูติล = {
แต่ละ: ฟังก์ชั่น (obj, ตัววนซ้ำ, บริบท) {
ถ้า (obj == null) กลับมา
ถ้า (nativeForEach && obj.forEach === NativeForEach) {
obj.forEach (ตัววนซ้ำบริบท)
} อื่น ๆ ถ้า (obj.length === + obj.length) {
สำหรับ (var i = 0; i < obj.length; i++) {
ถ้า (iterator.call(obj[i] || บริบท obj[i], i, obj) === จริง) กลับ
-
} อื่น {
สำหรับ (var k ใน obj) {
ถ้า (iterator.call(obj[k] || บริบท, obj[k], k, obj) === จริง) กลับ
-
-
-
แผนที่: ฟังก์ชั่น (obj, ตัววนซ้ำ, บริบท) {
ผลลัพธ์ var = []
ถ้า (obj == null) ส่งคืนผลลัพธ์
ถ้า (nativeMap && obj.map === NativeMap) ส่งคืน obj.map (ตัววนซ้ำ บริบท)
this.each (obj, ฟังก์ชั่น (val, i, coll) {
ผลลัพธ์ [i] = iterator.call (บริบท, val, i, coll)
-
ส่งกลับผลลัพธ์
-
-
นอกจากนี้ยังมีฟังก์ชันอรรถประโยชน์ เช่น ทุก บางส่วน ฯลฯ ที่ทำงานบนคอลเลกชัน (Array, Hash) ใช้วิธี util.xx เมื่อใช้งาน
หากมีการกำหนดคลาสการรวบรวม ก็จะมีข้อมูลการรวบรวมอยู่ภายในคลาสนี้
คัดลอกรหัสรหัสดังต่อไปนี้:
ฟังก์ชั่นการรวบรวม (ข้อมูล) {
this.data = ข้อมูล ||.
// คุณสมบัติอื่นๆ
// this.xxx = yyy
-
คอลเลกชัน.ต้นแบบ = {
// วิธีการบางอย่าง
-
คุณสามารถคัดลอกวิธีการบน util ไปยังคลาสคอลเลกชันได้อย่างง่ายดาย เช่น
คัดลอกรหัสรหัสดังต่อไปนี้:
ฟังก์ชั่น copyMethod (clazz, obj) {
สำหรับ (วิธี var ใน obj) {
clazz.prototype [วิธีการ] = ฟังก์ชั่น () {
var args = [].slice.call (อาร์กิวเมนต์)
เป้าหมาย var = this.data
args.unshift (เป้าหมาย)
obj [วิธีการ] . ใช้ (obj, args)
-
-
-
copyMethod (คอลเลกชัน, ยูทิลิตี้)
หลังจากการคัดลอกด้วยวิธีนี้ อินสแตนซ์ Collection จะมีเมธอดบน util และออบเจ็กต์การรวบรวม (พารามิเตอร์แรก) ที่ดำเนินการโดย util คือ this.data ของ Collection คุณสามารถสำรวจ this.data ได้โดยตรงดังนี้
คัดลอกรหัสรหัสดังต่อไปนี้:
var coll = คอลเลกชันใหม่ ([10, 20, 30])
// ข้าม
coll.each (ฟังก์ชัน (k) {
console.log(k)
-
// ดำเนินงาน
var arr = coll.map (ฟังก์ชั่น (k) {
รีเทิร์นเค-5
-
console.log(arr) // 5, 15, 25
รูปแบบนี้ใช้ในไลบรารีโอเพ่นซอร์สหลายแห่ง เช่น jQuery ซึ่งคัดลอก $.each/$.map ไปยัง $().each/$().map ได้อย่างสะดวก
อีกตัวอย่างหนึ่งคือ Backbone ซึ่ง _.each/_.map/_.every/_.chain (และอื่นๆ อีกมากมาย) จะถูกคัดลอกไปยังคอลเลกชันต้นแบบ
คัดลอกรหัสรหัสดังต่อไปนี้:
// ขีดเส้นใต้วิธีการที่เราต้องการนำไปใช้กับคอลเลกชัน
// 90% ของประโยชน์หลักของ Backbone Collections ได้ถูกนำไปใช้จริง
// ตรงนี้:
วิธีการ var = ['forEach', 'each', 'map', 'collect', 'reduce', 'foldl',
'ฉีด', 'reduceRight', 'โฟลเดอร์', 'ค้นหา', 'ตรวจจับ', 'ตัวกรอง', 'เลือก',
'ปฏิเสธ', 'ทุก', 'ทั้งหมด', 'บางส่วน', 'ใด ๆ ', 'รวม', 'มี', 'เรียกใช้'
'สูงสุด', 'ขั้นต่ำ', 'toArray', 'ขนาด', 'ครั้งแรก', 'หัว', 'รับ', 'เริ่มต้น', 'ส่วนที่เหลือ'
'tail', 'drop', 'last', 'ไม่มี', 'ความแตกต่าง', 'indexOf', 'สับเปลี่ยน',
'lastIndexOf', 'isEmpty', 'chain'];
// ผสมแต่ละวิธีในขีดล่างเป็นพร็อกซีให้กับ `Collection#models`
_.each(วิธีการ, ฟังก์ชั่น(วิธีการ) {
Collection.prototype[วิธีการ] = ฟังก์ชั่น() {
var args = Slice.call (อาร์กิวเมนต์);
args.unshift(this.models);
กลับ _ [วิธีการ] . ใช้ (_, args);
-
-
นอกจากนี้ วิธีการปฏิบัติจริงสำหรับวัตถุปฏิบัติการ เช่น _.keys / _.values / _.pairs / _.invert / _.pick จะถูกคัดลอกไปยัง Backbone.Model (ใหม่ใน 1.0)
คัดลอกรหัสรหัสดังต่อไปนี้:
var modelMethods = ['คีย์', 'ค่า', 'คู่', 'กลับด้าน', 'เลือก', 'ละเว้น'];
// ผสมวิธีขีดล่างแต่ละวิธีเป็นพร็อกซีของ `Model#attributes`
_.each (modelMethods ฟังก์ชัน (วิธีการ) {
Model.prototype[วิธีการ] = ฟังก์ชั่น() {
var args = Slice.call (อาร์กิวเมนต์);
args.unshift(this.attributes);
กลับ _ [วิธีการ] . ใช้ (_, args);
-
-