شما میتوانید یک Object را با استفاده از یک Object initializer ایجاد کنید. به عنوان یک راهکار جایگزین، ابتدا میتوانید یک Constructor function (تابع سازنده) تعریف کرده و سپس با فراخوانی آن تابع به همراه عملگر new، یک Object جدید بسازید (صدا بزنید).
به Object initializerها، Object literal (مقدار ثابت شیء) نیز گفته میشود (اصطلاح Object initializer با ترمینولوژی مورد استفاده در زبان ++C همخوانی دارد).
نحوِ (Syntax) ساخت یک شیء با استفاده از Object initializer به این صورت است:
const obj = {
property1: value1, // نام ویژگی میتواند یک شناسه (Identifier) باشد
2: value2, // یا یک عدد (Number)
"property n": value3, // یا یک رشته (String)
};
هر نام ویژگی (Property name) که قبل از دو نقطه (:) قرار میگیرد، یا یک شناسه (Identifier) است، یا یک مقدار ثابت عددی (Number literal) و یا یک مقدار ثابت رشتهای (String literal)؛ و هر valueN یک عبارت (Expression) است که مقدار آن به نام ویژگی مربوطه اختصاص داده میشود. نام ویژگی میتواند خود یک عبارت نیز باشد؛ کلیدهای محاسباتی و داینامیک (Computed keys) باید داخل کروشه [ ] قرار بگیرند.
در مثال بالا، Object تازه ساختهشده به یک متغیر به نام obj اختصاص داده شده است؛ اما این کار اختیاری است. اگر نیازی ندارید که در جاهای دیگر برنامه به این Object ارجاع دهید، نیازی به ذخیرهی آن در متغیر نیست. (نکته: اگر یک Object literal در جایی از کد ظاهر شود که مفسر انتظار یک دستور یا Statement را دارد، ممکن است لازم باشد آن را داخل پرانتز () بپیچید تا با یک بلوک کد یا Block statement اشتباه گرفته نشود).
دستورات Object initializer در واقع Expressions هستند؛ یعنی هر بار که دستورِ حاوی آنها اجرا میشود، یک Object کاملاً جدید ساخته خواهد شد. این یعنی حتی دو Object initializer کاملاً همسان و همشکل، دو Object متمایز و جداگانه ایجاد میکنند که در مقایسه، با هم برابر (===) نخواهند بود.
دستور زیر یک Object ایجاد کرده و آن را به متغیر x اختصاص میدهد، فقط و فقط اگر عبارت شرطی cond برقرار (True) باشد:
let x;
if (cond) {
x = { greeting: "hi there" };
}
مثال زیر شیئی به نام myHonda با سه ویژگی میسازد. توجه داشته باشید که ویژگی engine خودش یک Object دیگر با ویژگیهای مخصوص به خود است:
const myHonda = {
color: "red",
wheels: 4,
engine: { cylinders: 4, size: 2.2 },
};
به اشیائی که با initializers (کروشه) ساخته میشوند، Plain objects میگویند؛ زیرا آنها صرفاً نمونههایی (Instances) از شیء پایه Object هستند و به نوع شیء دیگری تعلق ندارند. برخی از انواع اشیاء، نحوِ مقداردهی ویژهای دارند؛ مانند Array initializers (برای آرایهها) و Regex literals (برای عبارات باقاعده).
به عنوان راهکار دوم، شما میتوانید طی دو مرحله یک Object بسازید:
نوع شیء (Object type) را با نوشتن یک Constructor function تعریف کنید. یک قرارداد و سنت محکم وجود دارد که نام این توابع را با حرف بزرگ شروع کنند.
با استفاده از کلمه کلیدی new، یک نمونه (Instance) از آن شیء بسازید.
برای تعریف نوع شیء، تابعی بنویسید که نام، ویژگیها (Properties) و متدهای (Methods) آن را مشخص کند. برای مثال، فرض کنید میخواهید یک Object type برای خودروها ایجاد کنید. میخواهید نام این نوع شیء Car باشد و ویژگیهایی برای کارخانه سازنده (make)، مدل (model) و سال ساخت (year) داشته باشد. برای این کار، تابع زیر را مینویسید:
function Car(make, model, year) {
this.make = make;
this.model = model;
this.year = year;
}
به استفاده از کلمه کلیدی this برای اختصاص دادن مقادیر به ویژگیهای Object (بر اساس مقادیری که به تابع پاس داده شدهاند) توجه کنید.
حالا میتوانید شیئی به نام myCar را به شکل زیر بسازید:
const myCar = new Car("Eagle", "Talon TSi", 1993);
این دستور شیء myCar را ساخته و مقادیر مشخص شده را به ویژگیهای آن اختصاص میدهد. پس از آن، مقدار myCar.make برابر با رشته "Eagle"، مقدار myCar.model برابر با رشته "Talon TSi" و مقدار myCar.year برابر با عدد 1993 خواهد بود. ترتیب آرگومانهای پاس داده شده باید دقیقاً با پارامترهای تابع یکی باشد.
شما میتوانید با فراخوانی عملگر new، هر تعداد که بخواهید Object از نوع Car بسازید:
const randCar = new Car("Nissan", "300ZX", 1992);
const kenCar = new Car("Mazda", "Miata", 1990);
یک Object میتواند ویژگیای داشته باشد که خودش یک Object دیگر باشد. برای مثال، فرض کنید شیئی به نام Person را به این صورت تعریف کردهاید:
function Person(name, age, sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
و سپس دو نمونهی جدید از Person میسازید:
const rand = new Person("Rand McKinnon", 33, "M");
const ken = new Person("Ken Jones", 39, "M");
حالا میتوانید تعریف ساختار Car را بازنویسی کنید تا شامل یک ویژگی به نام owner (مالک) باشد که یک شیء از نوع Person را دریافت میکند:
function Car(make, model, year, owner) {
this.make = make;
this.model = model;
this.year = year;
this.owner = owner;
}
برای نمونهسازی اشیاء جدید، به این صورت عمل میکنید:
const car1 = new Car("Eagle", "Talon TSi", 1993, rand);
const car2 = new Car("Nissan", "300ZX", 1992, ken);
توجه کنید که در دستورات بالا، به جای پاس دادن یک رشته متنی یا عدد ثابت، اشیاءِ rand و ken را به عنوان آرگومان برای پارامتر owner پاس دادهایم. حالا اگر بخواهید نام مالکِ خودروی car2 را بفهمید، میتوانید به ویژگی زیر دسترسی پیدا کنید:
car2.owner.name; // خروجی: "Ken Jones"
شما همیشه میتوانید یک Property جدید را به شیئی که قبلاً تعریف شده است اضافه کنید. برای مثال، دستور زیر:
car1.color = "black";
ویژگی color را به شیء car1 اضافه کرده و مقدار "black" را به آن میدهد. با این حال، این کار روی هیچ شیء دیگری تأثیر نمیگذارد. برای اضافه کردن یک ویژگی جدید به تمام اشیاء از یک نوع، باید آن ویژگی را به بدنه و تعریف اصلیِ شیء Car اضافه کنید.
نکته: امروزه میتوانید به جای ساختار تابع (Function syntax)، از ساختار استاندارد کلاسها (Class syntax) برای تعریف یک Constructor function استفاده کنید.
Object.create()اشیاء را میتوان با استفاده از متد Object.create() نیز خلق کرد. این متد بسیار کاربردی است؛ چرا که به شما اجازه میدهد تا شیء نمونهی اولیه (Prototype object) را برای شیئی که میخواهید بسازید مستقیماً انتخاب کنید، بدون اینکه نیازی به تعریف یک Constructor function داشته باشید.
// کپسولهسازی ویژگیها و متدهای حیوان (Animal)
const animalProto = {
type: "Invertebrates", // مقدار پیشفرض ویژگیها
displayType() {
// متدی که نوع حیوان را نمایش میدهد
console.log(this.type);
},
};
// ایجاد یک نوع حیوان جدید به نام animal
const animal = Object.create(animalProto);
animal.displayType(); // خروجی: Invertebrates
// ایجاد یک نوع حیوان جدید به نام fish
const fish = Object.create(animalProto);
fish.type = "Fishes";
fish.displayType(); // خروجی: Fishes
این محتوا کاملا رایگان توسط تیم کدلپر ترجمه شده و در اختیار شما کاربران عزیز قرار گرفته است، هر گونه کپی برداری برای مقاصد غیر رایگان و بدون ذکر منبع، مورد پیگیری قانونی قرار میگیرد.
ترجمه شده از منبع: https://developer.mozilla.org/en-US/docs/Web/JavaScript