مدیریت ویژگی ها (Object Management)
اینجا یاد می گیری «ویژگی (Property)»های شی را حرفه ای کنترل کنی. با متدها می توانی اضافه کنی، عوض کنی، و حتی رفتار نمایش را تنظیم کنی. مثل تنظیمات بازی که صدای افکت یا سختی را تغییر می دهی.
متدهای مدیریت ویژگی
این فهرست، خلاصه ابزارهای همین بخش است.
// افزودن یا تغییر یک ویژگی
Object.defineProperty(object, property, descriptor);
// افزودن یا تغییر چند ویژگی
Object.defineProperties(object, descriptors);
// گرفتن پیکربندی یک ویژگی
Object.getOwnPropertyDescriptor(object, property);
// گرفتن پیکربندی همه ویژگی ها
Object.getOwnPropertyDescriptors(object);
// لیست همه نام ویژگی ها (شامل غیرقابل شمارش)
Object.getOwnPropertyNames(object);
// دسترسی به پروتوتایپ
Object.getPrototypeOf(object);
Object.defineProperty(): افزودن ویژگی
با این متد، ویژگی تازه می سازی یا موجود را دقیق تنظیم می کنی.
const person = {
firstName: "John",
lastName: "Doe",
language: "EN"
};
Object.defineProperty(person, "year", { value: "2008" });
تغییر مقدار یک ویژگی
می خواهی مقدار عوض شود؟ دوباره با همان متد انجام بده.
const person = {
firstName: "John",
lastName: "Doe",
language: "EN"
};
Object.defineProperty(person, "language", { value: "NO" });
ویژگی های متادیتا: writable، enumerable، configurable
این سه، مثل قفل های دسترسی اند. با آن ها نوشتن، نمایش و بازپیکربندی را کنترل کن.
// فقط خواندنی
Object.defineProperty(person, "language", { writable: false });
// مخفی از حلقه ها
Object.defineProperty(person, "language", { enumerable: false });
// جلوگیری از بازپیکربندی
Object.defineProperty(person, "language", { configurable: false });
نکته: «قابل شمارش (Enumerable)» یعنی در حلقه ها دیده می شود. «قابل نوشتن (Writable)» یعنی مقدار عوض می شود. «قابل پیکربندی (Configurable)» یعنی تعریف دوباره ممکن است.
تعریف Getter و Setter با defineProperty
«گیرنده (Getter)» و «گذارنده (Setter)» رفتار خواندن و نوشتن را می سازند.
const person = {
firstName: "John",
lastName: "Doe"
};
Object.defineProperty(person, "fullName", {
get: function () {
return this.firstName + " " + this.lastName;
}
});
نمونه شمارنده با Getter/Setter
با دسترسی شبیه ویژگی، عملیات انجام بده.
const obj = {
counter: 0
};
Object.defineProperty(obj, "reset", {
get: function () {
this.counter = 0;
}
});
Object.defineProperty(obj, "increment", {
get: function () {
this.counter++;
}
});
Object.defineProperty(obj, "decrement", {
get: function () {
this.counter--;
}
});
Object.defineProperty(obj, "add", {
set: function (value) {
this.counter += value;
}
});
Object.defineProperty(obj, "subtract", {
set: function (i) {
this.counter -= i;
}
});
obj.reset;
obj.add = 5;
obj.subtract = 1;
obj.increment;
obj.decrement;
Object.getOwnPropertyNames(): همه نام ها
این متد، حتی ویژگی های غیرقابل شمارش را هم لیست می کند.
const person = {
firstName: "John",
lastName: "Doe",
language: "EN"
};
Object.getOwnPropertyNames(person);
const person = {
firstName: "John",
lastName: "Doe",
language: "EN"
};
Object.defineProperty(person, "language", { enumerable: false });
Object.getOwnPropertyNames(person);
Object.keys(): فقط قابل شمارش ها
اگر ویژگی را پنهان کنی، این متد آن را نشان نمی دهد.
const person = {
firstName: "John",
lastName: "Doe",
language: "EN"
};
Object.defineProperty(person, "language", { enumerable: false });
Object.keys(person);
گام های تمرینی
- یک شی دانش آموز بساز و year را با defineProperty اضافه کن.
- language را غیرقابل شمارش کن و خروجی keys را ببین.
- یک fullName با getter بساز و مقدار را بخوان.
ادامه مسیر: تکرار روی شی و گیرنده و گذارنده.
جمع بندی سریع
- defineProperty برای کنترل ریز ویژگی است.
- three flags: writable، enumerable، configurable مهم اند.
- getOwnPropertyNames همه را نشان می دهد.
- keys فقط قابل شمارش ها را می دهد.
- Getter/Setter رفتار خواندن و نوشتن را می سازد.