لنأخذ المثال أولاً:
// التسمم كائن. prototypeObject.prototype.bar = 1 ؛ var foo = {moo: 2} ؛ for (var i in foo) {console.log (i) ؛ // يطبع كل من البار و moo}نحن بحاجة إلى الانتباه إلى نقطتين هنا. أحدهما هو أن لـ in inop سوف يتجاهل السمة التي تم تعيينها على التعداد الخاطئة. على سبيل المثال ، خاصية طول الصفيف. ثانياً ، نظرًا لتجتاز سلسلة النماذج الأولية بأكملها ، عندما تكون سلسلة النموذج الأولي طويلًا جدًا ، سيكون لها تأثير على الأداء.
التعداد هي كلمة غريبة جدا. في الواقع ، من الصعب عليك أن تجد ظلها في JavaScript ، ويتم استعارةها بالفعل من المؤلف من Ruby. الغرض من إنشاء تعداد لا يمكن استخدامه بشكل مستقل ، ولكن لاستخدام الطريقة "المختلطة". العديد من الطرق في النموذج الأولي تستخدم التعداد ، لذلك يمكن القول أنه حجر الزاوية في النموذج الأولي. لن أقدم مقدمة مفصلة هنا ، يرجى الرجوع إلى التفاصيل - التعداد.
نظرًا لأننا لا نستطيع تغيير سلوك لـ in in ate نفسها ، لا يمكننا إلا أن نأخذ طرقًا أخرى لتصفية الخصائص التي لا تريد الظهور في الحلقة. من خلال "JavaScript Learning Notes Objects (III): HasownProperty" ، نعلم أن طريقة HasownProperty يمكنها القيام بذلك.
تصفية باستخدام hasownproperty
لا يزال يستخدم المثال السابق:
// تسمم كائن لـ (var i in foo) {if (foo.hasownproperty (i)) {console.log (i) ؛ }}هذه هي الطريقة الصحيحة الوحيدة لكتابته. نظرًا لأننا استخدمنا طريقة HasownProperty ، فإننا نخرج MOO فقط هذه المرة. إذا كانت طريقة HasOwNproperty غير قابلة للتطبيق ، فسيظهر خطأ عند تمديد الكائن.
الآن تختار العديد من الأطر تمديد الطريقة من Object.prototype ، لذلك عندما نستخدم هذه الأطر ، سنواجه مشاكل إذا استخدمنا في حلقة لا يتم ترشيحها باستخدام Hasownproperty.
لخص
يوصى بتطوير العادة الجيدة لخصائص تصفية Hasownproperty ، لا تضع أي افتراضات حول البيئة الجارية ، بغض النظر عما إذا كان كائن النموذج الأصلي قد تم توسيعه.