Object.setPrototypeOf()‎

من موسوعة حسوب
مراجعة 15:39، 28 يناير 2018 بواسطة عبد اللطيف ايمش (نقاش | مساهمات) (استبدال النص - '\[\[تصنيف:(.*)\]\]' ب'{{SUBPAGENAME}}')
(فرق) → مراجعة أقدم | المراجعة الحالية (فرق) | مراجعة أحدث ← (فرق)

الدالة Object.setPrototypeOf()‎ تضبط كائن prototype (أي الخاصية [[Prototype]] الداخلية) للكائن المُحدَّد إلى كائنٍ آخر أو إلى القيمة null.

تحذير: تغيير خاصية [[Prototype]] لأحد الكائنات هي عمليةٌ بطيئةٌ جدًا بسبب طبيعة تحسين محركات JavaScript الأداء للوصول إلى الخاصيات، وهي بطيئةٌ في جميع المتصفحات ومحركات JavaScript، وتأثيرها على الأداء بسبب تعديل طريقة وراثة الكائنات كبيرٌ وذو مدى بعيد، وليس مقتصرًا على الوقت اللازم لتنفيذ الدالة Object.setPrototypeOf()‎ فقط، لكنه سيمتد لأيّة شيفرات ستصل إلى أيّة كائنات تغيّرت فيها قيمة الخاصية [[Prototype]]؛ لذا إذا كنتَ مهتمًا بالأداء فتجنب تعديل هذه الخاصية، وذلك بإنشاء كائن جديد له كائن [[Prototype]] الذي تريده باستخدام الدالة Object.create().

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

Object.setPrototypeOf(obj, prototype);

obj

الكائن الذي نريد ضبط قيمة الخاصية prototype فيه.

prototype

قيمة كائن prototype الجديدة (كائن أو null).

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

الكائن المعطي.

الوصف

سترمي هذه الدالة الخطأ TypeError إذا كانت الخاصية [[Prototype]] التي سنُعدِّلها غير قابلة للتوسعة اعتمادًا على ناتج الدالة Object.isExtensible()‎.

لن تفعل هذه الدالة شيئًا إذا كان الوسيط prototype المُمرَّر إليها ليس كائنًا أو null (أي عدد أو سلسلة نصية أو قيمة منطقية أو undefined)؛ وعدا ذلك ستُعدِّل هذه الدالة الخاصية [[Prototype]] للكائن obj إلى القيمة الجديدة.

الدالة Object.setPrototypeOf()‎ موجودة في معيار ECMAScript 2015، وهي تُعدّ الطريقة الصحيحة لضبط كائن prototype لأحد الكائنات، مقارنةً مع الخاصية Object.prototype.__proto__‎ المثيرة للجدل.

أمثلة

مثال عن إنشاء كائن جديد له القيمة null للخاصية prototype:

var dict = Object.setPrototypeOf({}, null);

تعويض نقص دعم المتصفحات

باستخدام الخاصية القديمة Object.prototype.__proto__‎، يمكننا بسهولة تعريف الدالة Object.setPrototypeOf()‎ إن لم تكن متاحةً؛ لاحظ أنَّ الشيفرة الآتية تعمل في متصفحَي Chrome و Firefox لكن ليس في IE:

Object.setPrototypeOf = Object.setPrototypeOf || function(obj, proto) {
  obj.__proto__ = proto;
  return obj; 
}

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

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

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