Object.seal()‎

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

الدالة Object.seal()‎ تجعل الكائن مختومًا، مما يمنع إضافة خاصيات جديدة إليه، ويجعل جميع الخاصيات الموجودة مسبقًا فيه غيرَ قابلةٍ للضبط (non-configurable)؛ لكن ما يزال بالإمكان تعديل قيم الخاصيات الموجودة لطالما كانت قابلةً للكتابة (writable).

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

Object.seal(obj)

obj

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

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

الكائن المعني لكن مع جعله مختومًا.

الوصف

افتراضيًا، تكون الكائنات قابلةً للتوسعة (extensible، أي يمكن إضافة خاصيات جديدة إليها)، وجعل الكائن مختومًا يمنع إضافة خاصيات جديدة ويجعل جميع الخاصيات الموجودة غير قابلةٍ للضبط؛ وهذا يمكِّن تحويل خاصيات البيانات (data properties) إلى خاصيات وصول (accessor properties، مثل دوال getter و setter) والعكس صحيح، لكنه لا يمنع تعديل قيم الخاصيات.

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

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

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

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

المقارنة مع Object.freeze()

الخاصيات الموجودة في الكائنات المُجمَّدة عبر الدالة Object.freeze()‎ ستكون غير قابلة للتعديل أبدًا؛ لكن يمكن تعديل خاصيات الكائنات المختومة عبر الدالة Object.seal()‎.

أمثلة

من الممكن إضافة أو تعديل أو حذف خاصيات كائن عادي:

var obj = {
  prop: function() {},
  foo: 'bar'
};

obj.foo = 'baz';
obj.lumpy = 'woof';
delete obj.prop;

وستعيد الدالة Object.seal()‎ الكائن الذي أصبح مختومًا، ومن الممكن تغيير قيمة إحدى خاصيات الكائنات المختومة:

var o = Object.seal(obj);

o === obj; // true
Object.isSealed(obj); // === true

obj.foo = 'quux';

لكن لا يمكن تحويل خاصيات البيانات إلى خاصيات وصول (والعكس صحيح):

Object.defineProperty(obj, 'foo', {
  get: function() { return 'g'; }
}); // TypeError

وستفشل جميع التعديلات ما عدا تعديل قيمة الخاصيات:

obj.quaxxor = 'the friendly duck';
// سيفشل التعبير بصمت ولن تُضاف الخاصية
delete obj.foo;
// سيفشل التعبير بصمت ولن تُحذَف الخاصية

ومحاولة فعل ذلك في نمط strict سيرمي خطأ:

function fail() {
  'use strict';
  delete obj.foo; // TypeError
  obj.sparky = 'arf'; // TypeError
}
fail();

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

Object.defineProperty(obj, 'ohai', {
  value: 17
}); // TypeError
Object.defineProperty(obj, 'foo', {
  value: 'eit'
}); // ستُغيّر قيمة الخاصية

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

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

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