کلاسها معمولاً با استفاده از دستورات اعلان کلاس (Class declarations) ساخته میشوند:
class MyClass {
// بدنه کلاس...
}
درون بدنه یک کلاس (Class body)، قابلیتها و ویژگیهای متنوعی در دسترس شماست:
class MyClass {
// Constructor (سازنده)
constructor() {
// بدنه سازنده
}
// Instance field (فیلد نمونه)
myField = "foo";
// Instance method (متد نمونه)
myMethod() {
// بدنه متد
}
// Static field (فیلد استاتیک)
static myStaticField = "bar";
// Static method (متد استاتیک)
static myStaticMethod() {
// بدنه متد استاتیک
}
// Static block (بلوک استاتیک)
static {
// کدهای مقداردهی اولیه استاتیک
}
// تمام فیلدها، متدها، فیلدهای استاتیک و متدهای استاتیک
// دارای یک نسخه "خصوصی" یا Private نیز هستند
#myPrivateField = "bar";
}
اگر از دنیای قبل از نسخه ES6 آمده باشید، احتمالاً با استفاده از توابع به عنوان سازنده (Function constructors) آشنایی بیشتری دارید. الگوی کلاسی بالا، در ساختار قدیمیِ توابع سازنده تقریباً به شکل زیر ترجمه و پیادهسازی میشد:
function MyClass() {
this.myField = "foo";
// بدنه سازنده
}
MyClass.myStaticField = "bar";
MyClass.myStaticMethod = function () {
// بدنه متد استاتیک
};
MyClass.prototype.myMethod = function () {
// بدنه متد نمونه
};
(function () {
// کدهای مقداردهی اولیه استاتیک
})();
نکته: فیلدها و متدهای خصوصی (Private fields/methods) ویژگیهای جدیدی در کلاسها هستند که هیچ معادل ساده و سرراستی در توابع سازندهی قدیمی ندارند.
پس از اینکه یک کلاس اعلان شد، شما میتوانید با استفاده از عملگر new، نمونههایی (Instances) از روی آن خلق کنید:
const myInstance = new MyClass();
console.log(myInstance.myField); // خروجی: 'foo'
myInstance.myMethod();
توابع سازندهی سنتی و قدیمی را هم میشد با عملگر new به عنوان سازنده استفاده کرد و هم میشد آنها را بدون new مانند یک تابع معمولی صدا زد. اما تلاش برای فراخوانی یا "صدا زدن" یک کلاس بدون استفاده از کلمه کلیدی new، منجر به خطا خواهد شد:
const myInstance = MyClass();
// خطا رخ میدهد:
// TypeError: Class constructor MyClass cannot be invoked without 'new'
برخلاف اعلانهای تابع (Function declarations)، اعلانهای کلاس شامل فرآیند Hoisting یا بالا بردن نمیشوند (یا در برخی تفاسیر، بالا برده میشوند اما با محدودیت منطقه مرده موقت یا همان Temporal Dead Zone). این یعنی شما نمیتوانید قبل از اعلان یک کلاس، از آن استفاده کنید:
new MyClass();
// خطا رخ میدهد:
// ReferenceError: Cannot access 'MyClass' before initialization
class MyClass {}
این رفتار کاملاً مشابه رفتار متغیرهایی است که با کلمات کلیدی let و const تعریف میشوند.
دقیقاً مانند توابع، اعلانهای کلاس نیز همتای عبارتی یا همان Class expression دارند:
const MyClass = class {
// بدنه کلاس...
};
عبارات کلاسی میتوانند نامگذاری هم بشوند. با این حال، نامِ انتخاب شده برای عبارت (Expression's name) فقط و فقط در داخل بدنه خود کلاس قابل مشاهده و دسترسی است:
const MyClass = class MyClassLongerName {
// بدنه کلاس. در اینجا هم MyClass و هم MyClassLongerName به یک کلاس اشاره میکنند.
};
new MyClassLongerName();
// خطا رخ میدهد:
// ReferenceError: MyClassLongerName is not defined
این محتوا کاملا رایگان توسط تیم کدلپر ترجمه شده و در اختیار شما کاربران عزیز قرار گرفته است، هر گونه کپی برداری برای مقاصد غیر رایگان و بدون ذکر منبع، مورد پیگیری قانونی قرار میگیرد.
ترجمه شده از منبع: https://developer.mozilla.org/en-US/docs/Web/JavaScript