Object.preventExtensions()‎

من موسوعة حسوب
اذهب إلى التنقل اذهب إلى البحث

الدالة Object.preventExtensions()‎ تمنع إضافة خاصيات جديدة إلى الكائن.

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

Object.preventExtensions(obj)

obj

الكائن الذي نريد منع إضافة خاصيات جديدة إليه.

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

الكائن المعني لكن مع جعله لا يقبل خاصيات جديدة.

الوصف

يكون الكائن قابلًا للتوسعة إذا أمكن إضافة خاصيات جديدة إليه، والدالة Object.preventExtensions()‎ تجعل الكائن غير قابلٍ للتوسعة، أي أنَّه لن يقبل خاصيات جديدة لم تكن موجودةً فيه في وقت جعله غير قابلٍ للتوسعة.

لاحظ أنَّه عمومًا تكون خاصيات الكائنات غير القابلة للتوسعة قابلةً للحذف (عبر المعامل delete)، لكن محاولة إضافة خاصيات جديدة إلى كائنٍ غير قابلٍ للتوسعة ستفشل، إما بصمت أو برمي الخطأ TypeError (عادةً عندما تنفيذ الشيفرة في نمط strict، لكن هنالك حالات أخرى سيرمى فيها هذا الخطأ).

الدالة Object.preventExtensions()‎ تمنع إضافة خاصيات تابعة للكائن مباشرةً، لكن ما يزال بالإمكان إضافة الخاصيات إلى سلسلة prototype للكائن.

لا توجد طريقة لجعل الكائن قابلًا للتوسعة بعد تحويله إلى كائنٍ غير قابلٍ للتوسعة.

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

Object.preventExtensions(1);
// TypeError: 1 is not an object (ES5)

Object.preventExtensions(1);
// 1                             (ES2015)

أمثلة

لاحظ أنَّ الدالة Object.preventExtensions()‎ ستُعيد الكائن الذي حوّلته إلى كائنٍ غيرِ قابلٍ للتوسعة:

var obj = {};
var obj2 = Object.preventExtensions(obj);
obj === obj2; // true

تكون الكائنات قابلةً للتوسعة افتراضيًا، وسنختبر ذلك باستخدام الدالة Object.isExtensible()‎:

var empty = {};
Object.isExtensible(empty); // === true

// سنجعل الكائن غير قابلٍ للتوسعة
Object.preventExtensions(empty);
Object.isExtensible(empty); // === false

عند محاولة إضافة خاصية جديدة إلى كائنٍ غير قابلٍ للتوسعة باستخدام الدالة Object.defineProperty()‎، فسيرمى الخطأ TypeError:

var nonExtensible = { removable: true };
Object.preventExtensions(nonExtensible);
Object.defineProperty(nonExtensible, 'new', {
  value: 8675309
}); // TypeError: Cannot define property new, object is not extensible

وكذلك الأمر في نمط strict، فالشيفرة الآتية سترمي الخطأ TypeError:

function fail() {
  'use strict';
  // TypeError: Cannot add property newProperty, object is not extensible
  nonExtensible.newProperty = 'FAIL';
}
fail();

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

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

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