Object.prototype.hasOwnProperty()‎

من موسوعة حسوب

الدالة Object.prototype.hasOwnProperty()‎ تُعيد قيمةً منطقيةً تبيّن إن كان الكائن يمتلك خاصيةً ما مباشرةً (أي أنها لم يرثها).

البنية العامة

obj.hasOwnProperty(prop)

prop

سلسلة نصية String أو رمز Symbol للخاصية التي نريد اختبار وجودها في الكائن.

القيمة المعادة

قيمة منطقية Boolean تُشير إذا كانت الخاصية تابعةً للكائن مباشرةً أم لا.

الوصف

كل كائن ينحدر من الكائن Object يرث الدالة hasOwnProperty، ويمكن أن تُستخدَم هذه الدالة لتحديد إن كان يملك أحد الكائنات الخاصية المعنية مباشرةً؛ وعلى النقيض من المعامل in، هذه الدالة لا تتحقق من وجود الخاصية في سلسلة prototype التابعة للكائن.

أمثلة

اختبار وجود خاصية ما

المثال الآتي يُحدِّد إن كان الكائن o يملك خاصية باسم prop:

o = new Object();
o.prop = 'exists';

function changeO() {
  o.newprop = o.prop;
  delete o.prop;
}

o.hasOwnProperty('prop');   // true
changeO();
o.hasOwnProperty('prop');   // false

الخاصيات التابعة للكائن مباشرةً والخاصيات الموروثة

المثال الآتي يُفرِّق بين الخاصيات التابعة للكائن مباشرةً، والخاصيات التي يرثها عبر سلسلة prototype:

o = new Object();
o.prop = 'exists';
o.hasOwnProperty('prop');             // true
o.hasOwnProperty('toString');         // false
o.hasOwnProperty('hasOwnProperty');   // false

المرور على خاصيات أحد الكائنات

المثال الآتي يُظهِر كيفية المرور على الخاصيات التابعة لأحد الكائنات دونًا عن الخاصيات الموروثة؛ لاحظ أنَّ حلقة التكرار for...in تمرّ على الخاصيات القابلة للإحصاء فقط، لذا لا يجب أن نفترض أنَّ الدالة hasOwnProperty لن تُعيد إلا الخاصيات القابلة للإحصاء:

var buz = {
  fog: 'stack'
};

for (var name in buz) {
  if (buz.hasOwnProperty(name)) {
    console.log('this is fog (' + 
      name + ') for sure. Value: ' + buz[name]);
  }
  else {
    console.log(name);
  }
}

إنشاء خاصية باسم hasOwnProperty

لغة JavaScript لا تحمي اسم الخاصية hasOwnProperty، وبالتالي يمكن إنشاء خاصية تابعة للكائن بهذا الاسم؛ لهذا يكون من الضروري استخدام دالة hasOwnProperty «خارجية» للحصول على نتائج صحيحة في بعض الأحيان:

var foo = {
  hasOwnProperty: function() {
    return false;
  },
  bar: 'Here be dragons'
};

foo.hasOwnProperty('bar'); // تعيد دومًا القيمة false

يمكننا استخدام الدالة hasOwnProperty لكائنٍ آخر، عبر استخدام الدالة call وتمرير الكائن الذي نريد اختباره كقيمة this، كما في المثال الآتي:

({}).hasOwnProperty.call(foo, 'bar'); // true

من الممكن استخدام الخاصية hasOwnProperty من سلسلة prototype للكائن Object مباشرةً، وهذا يعني أنَّنا لن نُنشِئ كائنات جديدة غير مستخدمة:

Object.prototype.hasOwnProperty.call(foo, 'bar'); // true

دعم المتصفحات

الميزة Chrome Firefox Internet Explorer Opera Safari
الدعم الأساسي نعم نعم نعم نعم نعم

مصادر ومواصفات