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 |
---|---|---|---|---|---|
الدعم الأساسي | نعم | نعم | نعم | نعم | نعم |
مصادر ومواصفات
- مسودة المعيار ECMAScript Latest Draft.
- معيار ECMAScript 2015 (6th Edition).
- معيار ECMAScript 5.1.
- معيار ECMAScript 3rd Edition.