محدوده‌ی آبجکت ECMAScript

زون، حوزه اعتباری متغیرها است.

زون عمومی، خصوصی و حفاظتی

مفهوم

در طراحی برنامه‌های مستقل به روش سنتی، بیشتر به حوزه عمومی و خصوصی توجه می‌شود. ویژگی‌های حوزه عمومی می‌توانند از خارج از اشیا دسترسی پیدا شوند، یعنی پس از ایجاد نمونه‌ای از اشیا توسط توسعه‌دهندگان، می‌توانند از ویژگی‌های عمومی آن استفاده کنند. در حالی که ویژگی‌های حوزه خصوصی تنها می‌توانند در داخل اشیا دسترسی پیدا شوند، یعنی برای جهان خارج وجود ندارند. این به این معناست که اگر یک کلاس ویژگی‌ها و روش‌های خصوصی را تعریف کند، فرزندان آن نیز نمی‌توانند به این ویژگی‌ها و روش‌ها دسترسی پیدا کنند.

زون حفاظتی نیز برای تعریف ویژگی‌ها و روش‌های خصوصی استفاده می‌شود، اما این ویژگی‌ها و روش‌ها همچنین توسط فرزندان آن دسترسی دارند.

ECMAScript فقط حوزه عمومی دارد

بحث در مورد این حوزه‌ها در ECMAScript تقریباً بی‌معناست، زیرا در ECMAScript تنها یک حوزه وجود دارد - حوزه عمومی. تمام ویژگی‌ها و روش‌های همه اشیاء ECMAScript عمومی هستند. بنابراین، هنگام تعریف کلاس‌ها و اشیاء خود، باید بسیار مراقب باشید. به خاطر داشته باشید که تمام ویژگی‌ها و روش‌ها به صورت پیش‌فرض عمومی هستند!

راه‌حل پیشنهادی

بسیاری از توسعه‌دهندگان روش‌های مؤثر برای حوزه ویژگی‌ها را در اینترنت ارائه داده‌اند که این مشکل ECMAScript را حل می‌کند.

به دلیل فقدان حوزه خصوصی، توسعه‌دهندگان یک قرارداد را تعیین کرده‌اند که کدام ویژگی‌ها و روش‌ها باید به عنوان خصوصی در نظر گرفته شوند. این قرارداد规定 می‌کند که در ابتدا و انتهای ویژگی‌ها از زیرخط استفاده شود:

obj._color_ = "blue";

این کد، ویژگی color به صورت خصوصی است. توجه داشته باشید که زیرخط تغییر نمی‌کند که ویژگی عمومی است، بلکه فقط به توسعه‌دهندگان دیگر می‌گوید که باید این ویژگی را به عنوان خصوصی در نظر بگیرند.

بعضی توسعه‌دهندگان دوست دارند از یک خط زیر خط برای توضیح اعضای خصوصی استفاده کنند، به عنوان مثال: obj._color.

محدوده استاتیک

ویژگی‌ها و متد‌های تعریف شده در محدوده استاتیک در هر زمانی می‌توانند از یک مکان مشترک دسترسی پیدا کنند. در زبان برنامه‌نویسی Java، یک کلاس می‌تواند ویژگی‌ها و متد‌ها داشته باشد که بدون ایجاد یک نمونه از آن کلاس، می‌توان به آن‌ها دسترسی پیدا کرد، به عنوان مثال کلاس java.net.URLEncoder، که تابع encode() آن یک متد استاتیک است.

ECMAScript محدوده استاتیک ندارد

به طور دقیق، ECMAScript محدوده استاتیک ندارد. اما می‌تواند برای فراخوانی متد‌ها و ویژگی‌ها به فراخوانی‌های ساختاریارایه کمک کند. یادتان می‌آید که فراخوانی‌های ساختاریارایه فقط تابع هستند. تابع‌ها شیء هستند و شیء‌ها می‌توانند ویژگی‌ها و متد‌ها داشته باشند. به عنوان مثال:

function sayHello() {
  alert("hello");
}
sayHello.alternate = function() {
  alert("hi");
}
sayHello();		// خروجی "hello"
sayHello.alternate();	// خروجی "hi"

آموزش عملی

در اینجا، روش alternate() در واقع روشی از تابع sayHello است. می‌توان sayHello() را مانند یک تابع معمولی فراخوانی کرد تا "hello" را خروجی دهد، یا می‌توان sayHello.alternate() را فراخوانی کرد تا "hi" را خروجی دهد. حتی با این حال، alternate() در محدوده عمومی تابع sayHello() است و نه یک روش استاتیک.

کلمه کلیدی this

عملکرد this

یکی از مهم‌ترین مفاهیم که باید در ECMAScript یاد بگیریم، استفاده از کلمه کلیدی this است که در روش‌های شیء استفاده می‌شود. کلمه کلیدی this همیشه به شیء‌ای که روش را فراخوانی کرده اشاره دارد، به عنوان مثال:

var oCar = new Object;
oCar.color = "red";
oCar.showColor = function() {
  alert(this.color);
};
oCar.showColor();		// خروجی "red"

آموزش عملی

در کد بالا، کلمه کلیدی this در روش showColor() شیء استفاده شده است. در این محیط، this برابر با oCar است. کد زیر با کد بالا همان عملکرد را دارد:

var oCar = new Object;
oCar.color = "red";
oCar.showColor = function() {
  alert(oCar.color);
};
oCar.showColor();		// خروجی "red"

آموزش عملی

دلایل استفاده از this

چرا از this استفاده می‌کنیم؟ زیرا در زمان ایجاد یک نمونه از یک شیء، همیشه نمی‌توانیم متوجه شویم که توسعه‌دهنده چه نامی را برای متغیرها استفاده خواهد کرد. با استفاده از this، می‌توان یک تابع را در چندین مکان مختلف استفاده کرد. به مثال زیر فکر کنید:

function showColor() {
  alert(this.color);
};
var oCar1 = new Object;
oCar1.color = "red";
oCar1.showColor = showColor;
var oCar2 = new Object;
oCar2.color = "blue";
oCar2.showColor = showColor;
oCar1.showColor();		// خروجی "red"
oCar2.showColor();		// خروجی "blue"

آموزش عملی

در کد بالا، ابتدا تابع showColor() با استفاده از this تعریف شده است، سپس دو شیء (oCar1 و oCar2) ایجاد شده‌اند، یک شیء ویژگی color با مقدار "red" دارد و شیء دیگر ویژگی color با مقدار "blue" دارد. هر دو شیء ویژگی showColor دارند که به تابع اصلی showColor() اشاره می‌کنند (لطفاً توجه داشته باشید که در اینجا مشکلی در نام‌گذاری وجود ندارد، زیرا یکی تابع جهانی و دیگری ویژگی شیء است). اجرای showColor() برای هر شیء، oCar1 "red" و oCar2 "blue" را نمایش می‌دهد. این به دلیل این است که وقتی showColor() برای oCar1 اجرا می‌شود، کلیدواژه this در تابع برابر با oCar1 است. وقتی showColor() برای oCar2 اجرا می‌شود، کلیدواژه this در تابع برابر با oCar2 است.

توجه داشته باشید که برای اشاره به ویژگی‌های شیء، باید از کلیدواژه this استفاده شود. به عنوان مثال، اگر از کد زیر استفاده کنید، روش showColor() نمی‌تواند اجرا شود:

function showColor() {
  alert(color);
};

اگر از شیء یا کلیدواژه this برای اشاره به متغیر استفاده نشود، ECMAScript آن را به عنوان متغیر محلی یا جهانی در نظر می‌گیرد. سپس این تابع به دنبال متغیر محلی یا جهانی به نام color می‌گردد، اما نمی‌تواند آن را پیدا کند. نتیجه چه خواهد بود؟ تابع "null" را در اخطار نمایش می‌دهد.