Object.getOwnPropertyNames()‎

من موسوعة حسوب
مراجعة 06:37، 2 يناير 2018 بواسطة عبد اللطيف ايمش (نقاش | مساهمات)
(فرق) → مراجعة أقدم | المراجعة الحالية (فرق) | مراجعة أحدث ← (فرق)

الدالة Object.getOwnPropertyNames()‎ تُعيد مصفوفةً فيها جميع الخاصيات التابعة مباشرةً للكائن المعطي، بما في ذلك الخاصيات غير القابلة للإحصاء (non-enumerable) لكن باستثناء خاصيات الرموز Symbol.

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

Object.getOwnPropertyNames(obj)

obj

الكائن الذي نريد الحصول على جميع خاصياته.

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

مصفوفة فيها سلاسل نصية لأسماء جميع الخاصيات التابعة مباشرةً للكائن المعطي.

الوصف

الدالة Object.getOwnPropertyNames()‎ تُعيد مصفوفةً فيها جميع الخاصيات التابعة مباشرةً للكائن obj، وترتيب الخاصيات القابلة للإحصاء متوافقٌ مع الترتيب الذي تُظهِره حلقة التكرار for...in (أو الدالة Object.keys())؛ أما ترتيب الخاصيات غير القابلة للإحصاء في المصفوفة -وبين الخاصيات القابلة للإحصاء- غير مُعرَّف.

لاحظ أنَّه في معيار ECMAScript 5 كان استعمال هذه الدالة على وسيطٍ ليس كائنًا (أي قيمةً أوليةً) سيؤدي إلى رمي TypeError، لكن بدءًا من ECMAScript 2015 (أي ES6) فستُعامل الوسائط التي لا تُمثِّل كائنات على أنها كائنات:

Object.getOwnPropertyNames('foo');
// TypeError: "foo" is not an object (ES5)

Object.getOwnPropertyNames('foo');
// ["0", "1", "2", "length"]  (ES2015)

أمثلة

استخدام الدالة Object.getOwnPropertyNames()‎

سنستخدم الدالة Object.getOwnPropertyNames()‎ على مصفوفة فيها ثلاثة عناصر:

var arr = ['a', 'b', 'c'];
console.log(Object.getOwnPropertyNames(arr).sort()); 
// ["0", "1", "2", "length"]

أما المثال الآتي فيستخدم الدالة Object.getOwnPropertyNames()‎ على كائنٍ شبيهٍ بالمصفوفات:

var obj = { 0: 'a', 1: 'b', 2: 'c' };
console.log(Object.getOwnPropertyNames(obj).sort()); 
// ["0", "1", "2"]

لاحظ كيف ستُعرَض أسماء الخاصيات والقيم المرتبطة بها باستخدام الدالة Array.forEach()‎ على الكائن obj السابق:

Object.getOwnPropertyNames(obj).forEach(
  function (val, idx, array) {
    console.log(val + ' -> ' + obj[val]);
  }
);
// 0 -> a
// 1 -> b
// 2 -> c

هذا مثالٌ استخدمنا فيه الدالة Object.create() لإنشاء خاصية باسم getFoo غير قابلة للإحصاء (non-enumerable)، ثم أضفنا خاصيةً باسم foo إلى نفس الكائن:

var my_obj = Object.create({}, {
  getFoo: {
    value: function() { return this.foo; },
    enumerable: false
  }
});
my_obj.foo = 1;

console.log(Object.getOwnPropertyNames(my_obj).sort()); 
// ["foo", "getFoo"]

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

function ParentClass() {}
ParentClass.prototype.inheritedMethod = function() {};

function ChildClass() {
  this.prop = 5;
  this.method = function() {};
}
ChildClass.prototype = new ParentClass;
ChildClass.prototype.prototypeMethod = function() {};

console.log(
  Object.getOwnPropertyNames(
    new ChildClass() // ["prop", "method"]
  )
);

الحصول على الخاصيات غير القابلة للإحصاء فقط

المثال الآتي يستخدم الدالة Array.prototype.filter()‎ لإزالة مفاتيح الخاصيات القابلة للإحصاء (التي نحصل عليها من الدالة Object.keys()‎) من قائمة فيها مفاتيح كل الخاصيات (والتي نحصل عليها من الدالة Object.getOwnPropertyNames()‎) مما يترك مفاتيح الخاصيات غير القابلة للإحصاء:

var target = myObject;
var enum_and_nonenum = Object.getOwnPropertyNames(target);
var enum_only = Object.keys(target);
var nonenum_only = enum_and_nonenum.filter(function(key) {
  var indexInEnum = enum_only.indexOf(key);
  if (indexInEnum == -1) {
    // هذه الخاصية غير قابلة للإحصاء
    return true;
  } else {
    return false;
  }
});

console.log(nonenum_only);

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

الميزة Chrome Firefox Internet Explorer Opera Safari
الدعم الأساسي 5 4 9 12 5

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