محافظت از شی (Object Protection)
اینجا می خواهیم «محافظت از شی» را ساده کنیم. یعنی نگذاریم هرکس هرچیزی را تغییر دهد. مثل قفل کردن کمد مدرسه؛ گاهی فقط افزودن ممنوع است، گاهی حذف، و گاهی همه چیز.
const فقط جلوی تعویض مرجع را می گیرد
«ثابت (const)» یعنی مرجع عوض نشود. اما ویژگی ها هنوز قابل تغییرند. پس برای قفل کامل، سراغ متدهای شیء برو.
جلوگیری از افزودن: Object.preventExtensions()
«قابل گسترش (Extensible)» یعنی می توان ویژگی جدید افزود. این متد افزودن را می بندد.
// ایجاد شیء
const person = {
firstName: "John",
lastName: "Doe"
};
// بستن افزودن ویژگی
Object.preventExtensions(person);
// در حالت سخت گیرانه خطا می دهد
person.nationality = "English";
// آرایه هم شیء است
const fruits = [
"Banana",
"Orange",
"Apple",
"Mango"
];
Object.preventExtensions(fruits);
// افزودن عنصر جدید ممنوع است
fruits.push("Kiwi");
قابل گسترش است؟ Object.isExtensible()
این متد فقط بررسی می کند. اگر نتوان افزود، false برمی گرداند.
const person = {
firstName: "John",
lastName: "Doe"
};
Object.preventExtensions(person);
const answer = Object.isExtensible(person);
// answer === false
const fruits = [
"Banana",
"Orange",
"Apple",
"Mango"
];
Object.preventExtensions(fruits);
const answer = Object.isExtensible(fruits);
// answer === false
مهروموم: Object.seal()
«مهروموم (Seal)» یعنی افزودن و حذف ممنوع؛ پیکربندی هم ممنوع. اما مقدار ویژگی های موجود قابل تغییر است.
"use strict";
// ایجاد شیء
const person = {
firstName: "John",
lastName: "Doe",
age: 50,
eyeColor: "blue"
};
// مهروموم کردن
Object.seal(person);
// حذف ویژگی خطا می دهد
delete person.age;
const fruits = [
"Banana",
"Orange",
"Apple",
"Mango"
];
Object.seal(fruits);
// افزودن عنصر جدید خطا می دهد
fruits.push("Kiwi");
مهروموم است؟ Object.isSealed()
برای بررسی مهروموم بودن از این متد استفاده کن.
const person = {
firstName: "John",
lastName: "Doe"
};
Object.seal(person);
const answer = Object.isSealed(person);
// answer === true
const fruits = [
"Banana",
"Orange",
"Apple",
"Mango"
];
Object.seal(fruits);
const answer = Object.isSealed(fruits);
// answer === true
انجماد کامل: Object.freeze()
«یخ زدگی (Freeze)» یعنی هیچ تغییری مجاز نیست؛ نه افزودن، نه حذف، نه ویرایش.
"use strict";
// ایجاد شیء
const person = {
firstName: "John",
lastName: "Doe",
age: 50,
eyeColor: "blue"
};
// انجماد
Object.freeze(person);
// تغییر مقدار خطا می دهد
person.age = 51;
const fruits = [
"Banana",
"Orange",
"Apple",
"Mango"
];
Object.freeze(fruits);
// افزودن عنصر جدید خطا می دهد
fruits.push("Kiwi");
یخ زده است؟ Object.isFrozen()
اگر شیء یخ زده باشد، این متد true برمی گرداند.
const person = {
firstName: "John",
lastName: "Doe"
};
Object.freeze(person);
const answer = Object.isFrozen(person);
// answer === true
const fruits = [
"Banana",
"Orange",
"Apple",
"Mango"
];
Object.freeze(fruits);
const answer = Object.isFrozen(fruits);
// answer === true
نکته: در حالت غیر سخت گیرانه، برخی عملیات بی صدا شکست می خورند. در حالت سخت گیرانه، خطای TypeError می آید.
گام های تمرینی
- یک شیء بساز و extensible بودنش را بررسی کن.
- preventExtensions را اعمال کن و دوباره بررسی کن.
- شیء دیگر را seal و سپس freeze کن و تفاوت را ببین.
برای ادامه یادگیری، به گیرنده/گذارنده و مدیریت ویژگی ها سر بزن. همچنین صفحه محافظت از شی را نشانه گذاری کن.
جمع بندی سریع
- preventExtensions: افزودن ممنوع.
- seal: افزودن و حذف ممنوع؛ مقدارها قابل تغییر.
- freeze: هیچ تغییری مجاز نیست.
- is* فقط وضعیت را بررسی می کند.
- strict mode خطا را آشکار می کند.