آموزش جاوا اسکریپت javascript قسمت نهم

1396/4/28 اکرم کریمی 109

با سلام خدمت همه شما، کریمی هستم و با آموزش جاوااسکریپ در خدمت شما
در این جلسه قرار بر این شد که به مبحث شئ گرایی در جاوااسکریپت بپرداریم.
در اینجا میخواهیم با نوع خاصی از شئ گرایی که تحت عنوان prototyping شناخته می شود آشنا شویم. جاوااسکریپت یک زبان مبتنی بر prototype است و در آن ساختاری به نام کلاس وجود ندارد، اما از توابع به عنوان کلاس استفاده ميکند. مثلا براي تعريف کلاسي با نام Person داريم:

var Person = function(){};

يک شئ، نمونه اي از يک کلاس است و ما براي ايجاد يک نمونه (instance) جديد از کلاس Person به صورت زیر عمل میکنیم:

var person1 = new Person();ki
var person2 = new Person();
همانطور که میدانید یک متد سازنده (constructor) زمانی اجرا می شود که ما یک نمونه از کلاس را ایجاد کنیم و چون در اینجا ما یک فانکشن داریم و بدنه این function در لحظه ایجاد یک نمونه جدید از این کلاس اجرا خواهد شد کدهای مربوط به متد سازنده یا همان constructor را میتوانیم به صورت مستقیم در بدنه function یا همان کلاسمان قرار بدهیم.
var Person = function (){
 console.log('instance created');
};

var person1 = new Person();
var person2 = new Person();

یا اینکه میتوانیم این کدها را درون یک تابع در این کلاس قرار داده و آن را مجددا به صورت مستقیم در بدنه تابع فراخوانی کنیم. در هر صورت، بدنه اصلی تابع ما همان constructor است.

برای ایجاد حالتی که متد سازنده ما دارای پارامتر ورودی است تنها کافیست که تابع مربوط به کلاس آرگومان ورودی دریافت کند. مانند زیر:

var Person = function (firstName)}
 this.firstName = firstName;
 console.log('Person instantiated');
};
var person1 = new Person('Alice');
var person2 = new Person('Bob');

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

در کلاس نیز به همین گونه است، به عبارتی ما برای اینکه overload های گوناگونی برای constructor داشته باشیم نیازی به تعریف مجدد کلاس نداریم و باید به صورتی آرگومانهای ورودی تابع را مدیریت کنیم و تعداد آرگومانهای ورودی برابر بالاترین حالت تعداد آنها باشد.
در اکثر اوقاتی که تعداد آرگومانهای ورودی زیاد میشود ترجیح بر آن است که یک شئ که مجموعه ای از این مقادیر است را به عنوان ورودی دریافت کنیم. نمونه ای از هر دو فراخوانی:

var Person = function(name, family, age){};
var person = new Person(“Ali”, “Karimi”, “25”);
var Person = function(personSpecs){};
var person = new Person({ name: “Ali”, family: “Karimi”, age: “25”});
در خط دوم کد بالا کلمه کلیدی this را مشاهده میکنید:
 this.firstName = firstName;

در این خط ما یک پراپرتی تعریف کرده و مقدار آرگومان ورودی این کلاس را به آن انتساب داده ایم. this به شئ جاری ایجاد شونده در آینده اشاره دارد و پراپرتی firstName را برای آن تعریف میکند.

در یک کلاس ما به دو روش می توانیم یک ظرفی که مقداری را درون خود نگهداری میکند ایجاد کنیم.

var firstName = “Ali”;
this.firstName = “Ali”;

در هر دو روش ما یک مقدار را درون یک ظرف نگهداری کردیم اما نحوه دسترسی به این دو نیز متفاوت می باشد. در تعریف به صورت خط اول ما یک متغیر خصوصی یا private تعریف کرده ایم که نهایتا می توانیم در همین کلاس به آن دسترسی داشته باشیم اما در تعریف به روش دوم یک property برای شئ جاری ایجاد کرده ایم که در هر زمان که شئ ای از این کلاس ایجاد شود ما می توانیم به مقدار آن توسط شئ ایجاد شده دسترسی داشته باشیم و به عبارتی این ظرف به نمونه شئ ایجاد شده به ارث می رسد.
به همین شیوه، در صورتی که من بخواهم یک تابع با دسترسی محدود از درون همان کلاس داشته باشم، به شیوه قدیم عمل میکنم، اما در صورتی که من بخواهم متدی تعریف کنم که بتوان بعدا از طریق شئ ایجاد شده به آن دسترسی داشته باشم از کلمه کلیدی this استفاده میکنم. به صورت زیر:

function sayHello() { } // private
this.sayHello = function() { }; // public
در هنگام فراخوانی از طریق شئ ایجاد شده به روش زیر عمل می شود:
var person = new Person();
person.sayHello();

برای دسترسی به شئ جاری و پراپرتی ها و توابع آن در کل کلاس از کلمه کلیدی this استفاده میشود.
ادامه مباحث شئ گرایی در جلسه آینده

 

کلمات کلیدی