أولاً، هناك كائن مفرد به العديد من أساليب الأدوات الثابتة المرتبطة به. واحد منهم هو كل، والذي يستخدم لاجتياز المصفوفات أو الكائنات.
انسخ رمز الكود كما يلي:
فار أصليForEach = [].forEach
var originalMap = [].map
فاروتيل = {
كل: وظيفة (obj، مكرر، سياق) {
إذا تم إرجاع (obj == null).
إذا (nativeForEach && obj.forEach === أصليForEach) {
obj.forEach(مكرر، سياق)
} وإلا إذا (obj.length === +obj.length) {
لـ (var i = 0; i < obj.length; i++) {
إذا عاد (iterator.call(obj[i] || context, obj[i], i, obj) === true)
}
} آخر {
لـ (فار ك في الكائن) {
إذا عاد (iterator.call(obj[k] || context, obj[k], k, obj) === true)
}
}
},
الخريطة: الوظيفة (obj، التكرار، السياق) {
نتائج فار = []
إذا (obj == null) يُرجع النتائج
إذا (nativeMap && obj.map === originalMap) قم بإرجاع obj.map(iterator, context)
this.each(obj, function(val, i,col) {
النتائج [i] = iterator.call (context، val، i، Coll)
})
نتائج العودة
}
}
هناك أيضًا وظائف مساعدة مثل every، some، وما إلى ذلك التي تعمل على المجموعات (Array، Hash). استخدم طريقة util.xx عند استخدامه.
إذا تم تعريف فئة التجميع، فهناك بيانات تجميع داخل هذه الفئة.
انسخ رمز الكود كما يلي:
مجموعة الوظائف (البيانات) {
this.data = البيانات ||[]
// بعض الخصائص الأخرى
// this.xxx = yyy
}
مجموعة النموذج الأولي = {
// بعض الطرق
}
يمكنك بسهولة نسخ الأساليب الموجودة على util إلى فئة المجموعة، مثل
انسخ رمز الكود كما يلي:
وظيفة CopyMethod(clazz, obj) {
لـ (طريقة var في obj) {
clazz.prototype[method] = function() {
فار الحجج = [].slice.call(arguments)
فار الهدف = this.data
args.unshift (الهدف)
obj[method].apply(obj, args)
}
}
}
طريقة النسخ (المجموعة، الاستخدام)
بعد النسخ بهذه الطريقة، سيكون لمثيل المجموعة الطريقة على util، وكائن المجموعة (المعلمة الأولى) الذي يتم تشغيله بواسطة util هو this.data of Collection. يمكنك اجتياز هذه البيانات مباشرة على النحو التالي.
انسخ رمز الكود كما يلي:
فار كول = مجموعة جديدة([10، 20، 30])
// اجتياز
كول.كل (وظيفة (ك) {
console.log(ك)
})
// تعمل
فار آر = Coll.map(function(k) {
العودةk-5
})
console.log(arr) // 5، 15، 25
يُستخدم هذا النمط في العديد من المكتبات مفتوحة المصدر، مثل jQuery، الذي يتم نسخ $.each/$.map الخاص به بسهولة إلى $().each/$().map.
مثال آخر هو العمود الفقري، الذي تم نسخ _.each/_.map/_.every/_.chain (وغيرها الكثير) إلى النموذج الأولي للمجموعة.
انسخ رمز الكود كما يلي:
// الطرق السفلية التي نريد تنفيذها على المجموعة.
// تم بالفعل تنفيذ 90% من الفوائد الأساسية للمجموعات الأساسية
// هنا:
طرق فار = ['forEach'، 'each'، 'map'، 'collect'، 'reduce'، 'foldl'،
"حقن"، "تقليل لليمين"، "مجلد"، "بحث"، "كشف"، "تصفية"، "تحديد"،
"رفض"، "كل"، "كل"، "بعض"، "أي"، "تضمين"، "يحتوي على"، "استدعاء"،
"الحد الأقصى"، "الدقيقة"، "toArray"، "الحجم"، "الأول"، "الرأس"، "الأخذ"، "الأولي"، "الراحة"،
"ذيل"، "إسقاط"، "أخير"، "بدون"، "فرق"، "فهرس"، "خلط عشوائي"،
'lastIndexOf'، 'isEmpty'، 'chain']؛
// امزج كل أسلوب من أساليب الشرطة السفلية كبديل لـ `Collection#models`.
_.كل(طرق، وظيفة(طريقة) {
Collection.prototype[method] = function() {
فار args = شريحة.call(arguments);
args.unshift(this.models);
return _[method].apply(_, args);
};
});
بالإضافة إلى ذلك، يتم نسخ الأساليب العملية لتشغيل الكائنات مثل _.keys / _.values / _.pairs / _.invert / _.pick إلى Backbone.Model (الجديد في 1.0)
انسخ رمز الكود كما يلي:
var modelMethods = ['مفاتيح'، 'قيم'، 'أزواج'، 'عكس'، 'اختيار'، 'حذف']؛
// امزج كل أسلوب من أساليب Underscore كبديل لـ "Model#attributes".
_.each(modelMethods, وظيفة(طريقة) {
Model.prototype[method] = function() {
فار args = شريحة.call(arguments);
args.unshift(this.attributes);
return _[method].apply(_, args);
};
});