فیلدها
فیلدهای کلاس مستقیماً در بدنه یک کلاس اعلان می شوند، نه اینکه به صراحت به عنوان ویژگی this مقدار اضافه شوند. با این حال، نتیجه یکسان است: یک ویژگی که بر روی نمونه هایی از آن کلاس تعریف شده است.
class MyClass {
myField;
}
const myClassInstance = new MyClass();
myClassInstance;
> MyClass { myField: undefined }
می توانید یک فیلد را با یک مقدار مقداردهی اولیه کنید. این اغلب یک مقدار پیشفرض است که منطق درون کلاس میتواند آن را بازنویسی کند:
class MyClass {
myResult = false;
set setValue( myValue ) {
this.myResult = myValue;
}
}
const myClassInstance = new MyClass();
myClassInstance;
> Object { myResult: false }
myClassInstance.setValue = true;
myClassInstance;\
> Object { myResult: true }
فیلدهای کلاس از نظر عملکردی با ویژگی های متصل به کلاس با استفاده this یکسان هستند. این بدان معنی است که آنها را می توان از خارج از کلاس مانند هر ویژگی دیگری تغییر داد.
class MyClass {
myField = true;
}
const myClassInstance = new MyClass();
myClassInstance.myField;
> true
myClassInstance.myField = false;
myClassInstance.myField;
> false;
فیلدها مبنایی برای برخی از ویژگی های پیشرفته تر کلاس ها فراهم می کنند.
زمینه ها و روش های خصوصی
فیلدها و متدهای خصوصی خارج از کلاس غیرقابل دسترسی هستند. یک ویژگی خصوصی با یک نمونه از یک کلاس مرتبط است، به این معنی که هر نمونه شامل مجموعه ای از فیلدها و متدهای خصوصی خود است، همانطور که در کلاس تعریف شده است.
برای خصوصی کردن یک ویژگی، وقتی شناسه را اعلام می کنید، یک # به ابتدای شناسه اضافه کنید:
class MyClass {
#myPrivateField = true;
#myPrivateMethod() {}
}
const myClassInstance = new MyClass();
myClassInstance;
> MyClass { #myPrivateField: true }
#myPrivateField: true
<prototype>: Object { … }
constructor: class MyClass {}
<prototype>: Object { … }
یک فیلد خصوصی باید در بدنه کلاس حاوی اعلان شود. می توانید مقدار آن را بعداً به عنوان ویژگی this تغییر دهید، اما نمی توانید با استفاده this فیلد را ایجاد کنید.
فیلدهای خصوصی از جای دیگری در اسکریپت قابل دسترسی نیستند. این امر از تغییر خصوصیات داده در خارج از متدهای دریافت کننده و تنظیم کننده ارائه شده برای تعامل با مقادیر آنها جلوگیری می کند و از دسترسی مستقیم به روش هایی که فقط برای استفاده در خود کلاس در نظر گرفته شده اند جلوگیری می کند.
class MyClass {
#myResult = false;
set setValue( myValue ) {
this.#myResult = myValue;
}
}
const myClassInstance = new MyClass();
myClassInstance;
> MyClass { #myResult: false }
myClassInstance.#myResult = true;
> Uncaught SyntaxError: reference to undeclared private field or method #myResult
myClassInstance.setValue = true;
myClassInstance;\
> MyClass { #myResult: true }
با این حال، به خاطر داشته باشید که کنسولهای توسعهدهنده مرورگرها معمولاً در مورد اجازه دسترسی به فیلدهای خصوصی برای اهداف اشکالزدایی، بسیار سهلگیر هستند، هرچند متناقض:
class MyClass {
#myPrivateField = true;
#myPrivateMethod() {
console.log( "This is inside a private method." );
}
}
const myClassInstance = new MyClass();
myClassInstance;
> MyClass {#myPrivateField: true}
myClassInstance.#myPrivateField;
> true
myClassInstance.#myPrivateMethod();
> "This is inside a private method."
class MyClass {
#myPrivateField = true;