Object Protection

در جاوااسکریپت برای محافظت از اشیاء (Objects) چند روش مختلف وجود داره که هرکدوم سطح متفاوتی از محدودیت ایجاد می‌کنن.

1️⃣ جلوگیری از افزودن پراپرتی جدید → ()Object.preventExtensions

  • نمی‌ذاره پراپرتی جدید به شیء اضافه بشه.

  • ولی می‌تونی پراپرتی‌های موجود رو تغییر یا حذف کنی.

const user = { name: "Ali" }; Object.preventExtensions(user); user.age = 25; // ❌ اضافه نمی‌شه delete user.name; // ✅ حذف می‌شه user.name = "Sara"; // ✅ تغییر می‌کنه console.log(user); // {}

2️⃣ مهر و موم کردن شیء → ()Object.seal

  • جلوی اضافه کردن و حذف کردن رو می‌گیره.

  • ولی تغییر مقدار پراپرتی‌ها مجازه.

const car = { brand: "BMW", model: "X5" }; Object.seal(car); car.color = "Red"; // ❌ اضافه نمی‌شه delete car.model; // ❌ حذف نمی‌شه car.brand = "Audi"; // ✅ تغییر می‌کنه console.log(car); // { brand: "Audi", model: "X5" }

3️⃣ فریز کردن شیء → ()Object.freeze

  • کامل‌ترین سطح حفاظت.

  • هیچ افزودن، حذف یا تغییری مجاز نیست.

const book = { title: "JS", price: 200 }; Object.freeze(book); book.price = 300; // ❌ تغییر نمی‌کنه delete book.title; // ❌ حذف نمی‌شه book.author = "Ali"; // ❌ اضافه نمی‌شه console.log(book); // { title: "JS", price: 200 }

4️⃣ بررسی وضعیت شیء

  • Object.isExtensible(obj) → می‌شه پراپرتی جدید اضافه کرد؟

  • Object.isSealed(obj) → شیء سیل شده؟

  • Object.isFrozen(obj) → شیء فریز شده؟

console.log(Object.isExtensible(user)); // false console.log(Object.isSealed(car)); // true console.log(Object.isFrozen(book)); // true

5️⃣ کنترل پراپرتی‌ها با Descriptor

می‌تونی سطح دسترسی تک‌تک پراپرتی‌ها رو مشخص کنی:

const person = {}; Object.defineProperty(person, "name", { value: "Ali", writable: false, // ❌ مقدار قابل تغییر نیست enumerable: true, // ✅ توی حلقه‌ها میاد configurable: false // ❌ قابل حذف نیست }); console.log(person.name); // Ali person.name = "Sara"; // ❌ تغییر نمی‌کنه delete person.name; // ❌ حذف نمی‌شه

📊 جدول مقایسه‌ای

متد / ویژگیافزودنحذفتغییر مقدارتوضیح
preventExtensionsفقط نمی‌ذاره پراپرتی جدید اضافه بشه
sealفقط تغییر مقدار مجازه
freezeکاملاً immutable می‌کنه
definePropertyکنترل دقیقکنترل دقیقکنترل دقیقروی هر پراپرتی جدا میشه تنظیم کرد

✨ اینا ابزارهای اصلی هستن برای محافظت از Object تو جاوااسکریپت.