Object.isFrozen()‎

من موسوعة حسوب
اذهب إلى: تصفح، ابحث

الدالة Object.isFrozen()‎ تُحدِّد إن كان أحد الكائنات مُجمَّدًا.

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

Object.isFrozen(obj)

obj

الكائن الذي نريد التحقق منه.

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

قيمة منطقية (Boolean) تبيّن إذا كان الكائن مجمَّدًا أم لا.

الوصف

يكون الكائن مجمدًا إذا لم يكن قابلًا للتوسعة، وكانت جميع خاصياته غير قابلة للضبط (non-configurable)، وكانت جميع خاصيات البيانات (data properties، أي الخاصيات التي ليست دوال getter و setter) غير قابلة للكتابة (non-writable).

لاحظ أنَّه في معيار ECMAScript 5 كان استعمال هذه الدالة على وسيطٍ ليس كائنًا (أي قيمةً أوليةً) سيؤدي إلى رمي TypeError، لكن بدءًا من ECMAScript 2015 (أي ES6) فستُعامل الوسائط التي لا تُمثِّل كائنات على أنها كائنات مجمَّدة، أي أنها ستُعيد القيمة true:
Object.isFrozen(1);
// TypeError: 1 is not an object (ES5)

Object.isFrozen(1);
// true                          (ES2015)

أمثلة

الكائنات الجديدة تكون قابلةً للتوسعة، أي أنها ليست مجمَّدة:
Object.isFrozen({}); // === false
والكائنات الفارغة غير القابلة للتوسعة هي كائنات مجمَّدة (في الحالة الراهنة):
var emptyFrozen = Object.preventExtensions({});
Object.isFrozen(emptyFrozen); // === true
الكائنات الجديدة التي تملك خاصيةً واحدةً تكون قابلةً للتوسعة، أي أنها ليست مجمَّدة:
var oneProp = { p: 42 };
Object.isFrozen(oneProp); // === false
إذا منعنا توسعة الكائن oneProp (في المثال السابق) فلن يصبح الكائن مجمَّدًا، ذلك لأنَّ الخاصية الموجودة فيه ما تزال قابلةً للضبط (وقابلةً للكتابة):
Object.preventExtensions(oneProp);
Object.isFrozen(oneProp); // === false
لكن حذف (عبر المعامل delete) تلك الخاصية (الخاصية p من الكائن oneProp) سيؤدي إلى جعل الكائن مجمَّدًا في الحالة الراهنة:
delete oneProp.p;
Object.isFrozen(oneProp); // === true
هذا مثالٌ آخرٌ عن كائنٍ لا يمكن توسعته، وفيه خاصيةٌ غير قابلةٍ للكتابة، لكنه لن يُعدّ مجمَّدًا لأنَّ تلك الخاصية ما تزال قابلةً للضبط:
var nonWritable = { e: 'prop' };
Object.preventExtensions(nonWritable);
Object.defineProperty(nonWritable, 'e', {
  writable: false
}); // جعل الخاصية غير قابلةٍ للكتابة
Object.isFrozen(nonWritable); // === false
وإذا عدّلنا تلك الخاصية وجعلناها غير قابلةٍ للضبط، فسيصبح الكائن مجمَّدًا:
Object.defineProperty(nonWritable, 'e', {
  configurable: false
}); // جعل الخاصية غير قابلةٍ للضبط
Object.isFrozen(nonWritable); // === true
وكما في المثال السابق، إذا كان لدينا كائنٌ غيرُ قابلٍ للتوسعة وفيه خاصيةٌ غير قابلةٍ للضبط لكنها قابلةٌ للكتابة، فلن يكون مجمَّدًا:
var nonConfigurable = { release: 'NON_CONF' };
Object.preventExtensions(nonConfigurable);
Object.defineProperty(nonConfigurable, 'release', {
  configurable: false
});
Object.isFrozen(nonConfigurable); // === false
وتعديل تلك الخاصية وجعلها غير قابلةٍ للكتابة سيجعل الكائن مجمَّدًا:
Object.defineProperty(nonConfigurable, 'release', {
  writable: false
});
Object.isFrozen(nonConfigurable); // === true
وكائنٌ غيرُ قابلٍ للتوسعة وفيه خاصيةُ وصولٍ (accessor property، وهي دالة getter في مثالنا هذا) لا يُمثِّل كائنًا مجمَّدًا:
var accessor = { get food() { return 'yum'; } };
Object.preventExtensions(accessor);
Object.isFrozen(accessor); // === false
لكن جعل تلك الخاصية غير قابلةٍ للضبط سيؤدي إلى جعل الكائن مجمَّدًا:
Object.defineProperty(accessor, 'food', {
  configurable: false
});
Object.isFrozen(accessor); // === true
أسهل طريقة لتجميع الكائن هي استدعاء الدالة Object.freeze() عليه:
var frozen = { 1: 81 };
Object.isFrozen(frozen); // === false
Object.freeze(frozen);
Object.isFrozen(frozen); // === true

// الكائنات المجمَّدة غير قابلة للتوسعة
Object.isExtensible(frozen); // === false

// الكائنات المجمَّدة هي كائنات مختومة أيضًا
Object.isSealed(frozen); // === true

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

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

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