الفرق بين المراجعتين لصفحة: «JavaScript/Object/seal»
لا ملخص تعديل |
ط استبدال النص - '\[\[تصنيف:(.*)\]\]' ب'{{SUBPAGENAME}}' |
||
سطر 97: | سطر 97: | ||
*معيار [http://www.ecma-international.org/ecma-262/6.0/#sec-object.seal ECMAScript 2015 (6th Edition)]. | *معيار [http://www.ecma-international.org/ecma-262/6.0/#sec-object.seal ECMAScript 2015 (6th Edition)]. | ||
*معيار [http://www.ecma-international.org/ecma-262/5.1/#sec-15.2.3.8 ECMAScript 5.1]. | *معيار [http://www.ecma-international.org/ecma-262/5.1/#sec-15.2.3.8 ECMAScript 5.1]. | ||
[[تصنيف:JavaScript]] | [[تصنيف:JavaScript|{{SUBPAGENAME}}]] | ||
[[تصنيف:JavaScript Global Objects]] | [[تصنيف:JavaScript Global Objects|{{SUBPAGENAME}}]] | ||
[[تصنيف:JavaScript Object]] | [[تصنيف:JavaScript Object|{{SUBPAGENAME}}]] |
المراجعة الحالية بتاريخ 15:39، 28 يناير 2018
الدالة 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 |
مصادر ومواصفات
- مسودة المعيار ECMAScript Latest Draft.
- معيار ECMAScript 2015 (6th Edition).
- معيار ECMAScript 5.1.