في هذا البرنامج التعليمي، سنرى جوانب القيود والوظائف المتعلقة بـ hasOwnProperty() الطريقة في جافا سكريبت. سنتعرف أيضًا على تطبيقاته واستخداماته في الأقسام.
مقدمة
في جافا سكريبت ، يتم تعريف الأسلوب hasOwnProperty () كخاصية للتأكد مما إذا كان الكائن ينتمي إلى المشروع المذكور أم لا. إذا وجد أن الخاصية تنتمي إلى كائن تم التعرف عليه، فيجب أن تُرجع مخرجات مبنية على عبارة منطقية، أي صواب أو خطأ.
بناء الجملة
object.hasOwnProperty(propname)
دعوى
تسجيل:
هنا، نحتاج إلى تمرير الرمز أو اسم السلسلة لأن هذا هو مكان الدعامة حيث يتم التحقق مما إذا كان الرمز أو السلسلة تنتمي إلى الكائن. ويتم ذلك باستخدام الطريقة الموضحة أدناه.
var movie = { name: 'iron man', genre: 'super hit', } var song = { name: 'cardigan', } movie.hasOwnProperty('name'); // returns true movie.hasOwnProperty('type'); // returns false song.hasOwnProperty('name'); // returns true song.hasOwnProperty('status'); // returns false
أحد الجوانب المهمة التي يجب ملاحظتها هنا هو أن التابع hasOwnProperty() يتجاهل عمومًا الخصائص الموروثة. هذا يعني أن هذه الطريقة يجب أن تُرجع صحتها إذا وجد أن الكائن يحتوي على خاصية غير موروثة وتم تحديد الاسم بواسطة اسم العنصر. إذا أعادت خطأ، فهذا يعني أن الكائن لا يحتوي على أي خاصية باسم محدد، أو أنه ورث الخاصية من كائن نوع الخاصية.
// Create an object var o = new Object(); // Define a noninherited local property o.x = 3.14; o.hasOwnProperty('x'); // Returns true: x is a local property of o o.hasOwnProperty('y'); // Returns false: o doesn't have a property y o.hasOwnProperty('toString'); // Returns false: toString property is inherited hasOwnProperty() will return true even if you define the undefined or null value. let a = new Object(); a.propertyOne = null; a.hasOwnProperty('propertyOne') // output: true a.propertyTwo = undefined; a.hasOwnProperty('propertyTwo') //Output: true
ميزة إضافية أخرى لاستخدام التابع hasOwnProperty() هي أنه يمكنه تهيئة كائن من خلال متابعة مفهوم تمرير سلسلة كوسيطة افتراضية. يجب أن يستجيب بسرعة بصحيح إذا وجد أن القيمة متاحة للكائن. وإلا فإنه سيعود كاذبا إذا لم يتم العثور عليه. يمكن إثبات ذلك باستخدام مقتطف الشفرة الوارد أدناه.
function Car(name) { this.name = name; } Car.prototype.color = 'red'; const bmw = new Car('x1'); console.log(bmw.name); // property found on object console.log(bmw.color); // color property found on prototype console.log(bmw.hasOwnProperty('name')); // name is found on the object itself console.log(bmw.hasOwnProperty('color')); // color property is not found on the object itself
في مقتطف التعليمات البرمجية الموضح أعلاه، يقوم المتغير بإنشاء كائن جديد، سيارة . يمكن الآن القول أن السيارة قد بدأت مع تحديد خصائصها واسمها ضمن المنشئ. على الرغم من أنه قد لا يتم ذكر اللون داخل الكائن عند البدء فيه، إلا أنه سيكون متاحًا دائمًا في النموذج الأولي تَسَلسُل . لذلك، فإن التابع hasOwnProperty() سيُرجع القيمة true دائمًا للاسم، ولكن بالنسبة للون، سيُرجع false.
تعدد الأشكال في جاوة
عندما يتعلق الأمر بالأداء، يعمل hasOwnProperty() بسلاسة أثناء شق طريقه عبر الكائن باستخدام الحلقات. الآن، يمكننا أن نقول أنه إذا كانت الخصائص تنتمي على وجه التحديد إلى الكائن. ليس لديهم أي علاقة مع النموذج الأولي. يمكن عرض العرض التوضيحي لهذا باستخدام مقتطف الشفرة الموضح أدناه.
// declaring a Car function function Car(name) { this.name = name; } // setting up new prop with prototype Car.prototype.color = 'red'; // creating a new Car object const BMW = new Car('x1'); // looping through every car prop including prototype as well for (let car in BMW) { car + ':', BMW[car]; } /* output: name: x1 output: color: red */ /**************************************/ /*will loop through only self properties of the object, excludes property generated through prototype method */ for (let car in BMW) { if (BMW.hasOwnProperty(car)) { console.log(car + ':', BMW[car]); } } // output: name:
أثناء استخدام التابع hasOwnProperty()، قد يصبح عديم الفائدة لأن عرض الكائن يحدث عند تعريف خاصية باسم hasOwnProperty. لدعم ذلك، حاول فهم مقتطف الشفرة الوارد أدناه.
var harrypotter = { hasOwnProperty: function() { return true; } }; // Outputs: true console.log(harrypotter.hasOwnProperty('ridikulus'));
في مقتطف الكود أعلاه، من الواضح أن harrypotter لديه بالفعل خاصية hasOwnProperty. وبالتالي، لن يقوم أبدًا باستدعاء الكائن.prototype.hasOwnProperty. من المفترض أن هذا قد يواجه حالات قد يسمح فيها بإجراء مكالمة، لكنه قد يفشل في النهاية. لذلك، يوصى دائمًا بأن تكون على دراية بإمكانية إجراء المكالمات. يوضح مقتطف الكود أدناه الحل البديل.
// Returns false Object.prototype.hasOwnProperty.call(harrypotter, 'ridikulus');
في مقتطف الكود أعلاه، من الواضح أن harrypotter يحدد ما هو خاص به hasOwnProperty . لن يقوم أبدًا بإجراء مكالمات إلى Object.prototype.hasOwnProperty نظرًا لوجود احتمال أن يُرجع خطأ إذا واجه بعض الحالات حيث تكون القيمة خاطئة ويصبح من الصعب جعل الأمور تسير على ما يرام. لدعم هذا البيان، راجع مقتطف الشفرة الموضح أدناه.
// Returns false Obje ct.prototype.hasOwnProperty.call(harrypotter, 'ridikulus');
على غرار hasOwnProperty، هناك طريقة أخرى تسمى الطريقة 'in'. يتم استخدامه أيضًا للتحقق مما إذا كان المفتاح موجودًا للكائن أم لا. ومع ذلك، من المهم ملاحظة أن الفرق الرئيسي بين hasOwnProperty وin الأسلوب يكمن في حقيقة أن الأسلوب in لن يتبع ترتيب التمييز بين الخصائص الموروثة والخصائص الموروثة التي تم إنشاؤها خصيصًا للكائن. يمكن إظهار ذلك باستخدام مقتطف الشفرة الموضح أدناه.
var fantasyLit = { tolkien: 'The Lord of the Rings', lewis: 'The Chronicles of Narnia' }; // Outputs: true console.log('tolkien' in fantasyLit); // Outputs: false console.log('asimov' in fantasyLit); // Outputs: true console.log('constructor' in fantasyLit);
في مقتطف التعليمات البرمجية أعلاه، من الواضح أن الأسلوب 'in' يتبع خاصية الإنشاء الخاصة بـ Object.prototype حيث يتم وراثة جميع الكائنات.
ولإضافة بعض النقاط، هناك عيب لكلتا الطريقتين. يمكن لكلتا الطريقتين أن تقدما لنا بسهولة معلومات حول خاصية تم الإعلان عنها بالفعل، لكن لا يمكنهما إخبارنا عن الخاصية التي تحتوي على قيمة حقيقية.
خذ بعين الاعتبار مقتطف التعليمات البرمجية التالي الذي يوضح كيفية تطبيق كلا الطريقتين لهذا الحل البديل.
// Puts a 'declared' property on the global object // (window in browsers) var declared; // Outputs: true console.log('declared' in window); // Outputs: true console.log(window.hasOwnProperty('declared')); // Outputs: undefined console.log(declared); var obj = { myUndefined: undefined }; // Outputs: true console.log('myUndefined' in obj); // Outputs: true console.log(obj.hasOwnProperty('myUndefined')); // Outputs: undefined console.log(obj.myUndefined);
خاتمة
في هذا البرنامج التعليمي، ناقشنا طريقة hasOwnProperty() في JavaScript. بشكل عام، تعد هذه الطريقة خيارًا رائعًا لمعظم المطورين للاستفسار وتجنب المشكلات المتعلقة ببعض المفاتيح الخاصة مثل المُنشئ. من المستحسن أنه إذا وجدنا أي كائن له أي خاصية، فسوف يستخدم hasOwnProperty() افتراضيًا. في حالة وجود دالة مخصصة لإجراء مكالمة عن طريق التحقق من الكائن لأسلوب toString()، يجب علينا استخدام in.