prototype در يك جمله هسته اصلي ارث بري در زبان ActionScrip 1 و كلا وجه تمايز زبانهاي Object-based و Class-based است حتي گاها زبانهاي Object-based را Prototype-based مي نامند و علت آن وجود يك Object به نام prototype در سيستم تعريف كلاسها در اين زبانهاست كه نقش بسيار مهمي را ايفا مي كند.
به طور قطع نميشه مفهوم كامل prototype را در اينجا بيان كرد ولي سعي مي كنم يه صورت اجمالي توضيحي را در مورد prototype در ارائه بدم. من فرض مي كنم كه شما با مفاهيم اوليه Object ،Class و ارث بري آشنا هستيد. در هر حال اگر نيازي به يك نگاه اجمالي به مفاهيم Object Oriented داريد من چند وقت پيش توضيحاتي در اين باره در مورد زبانهاي Object-based و Class-based در همين سايت ارائه دادم كه مي توانيد در
اينجا ببينيد.
در اينجا من فقط در مورد زبانهاي Object-based صحبت مي كنم.
prototype در لغت به معني نمونه اوليه مي باشد و در برنامه نويسي به يك Object گفته مي شود كه نمونه اوليه ساخته شده از يك كلاس مي باشد و كليه Object هاي ساخته شده از آن class به نوعي از آن ارث مي برند. هنگامي كه شما يك class را تعريف مي كنيد كامپايلر به صورت خودكار يك Object به اسم prototype به صورت يك مشخصه static بر روي class تعريف مي كند كه دقيقا مانند object هايي است كه توسط برنامه نويس ايجاد مي شود با اين تفاوت كه اين Object به عنوان reference براي بقيه object هاي ايجاد شده از آن class استفاده مي شود همچنين اين Object بدون استفاده از constructor كلاس ساخته مي شود. برنامه نويس مي تواند به دلخواه مشخصه ها و يا متد هايي را بر روي prototype تعريف كند كه اين مشخصه ها براي تمامي object هاي ايجاد شده از آن class مشترك هستند. اين بدين معني است كه هنگامي كه يك مشخصه و يا متد از يك object صدا زده مي شود interpreter زبان ابتدا قلمرو (scope) همان Object را بررسي مي كند و در صورت يافت نشدن، آنرا در قلمرو prototype آن class جستجو مي كند. يك مثال ساده:
ابتدا كلاسي به اسم Benz ايجاد مي كنيم و در بدنه class فقط سال ساخته شدن را به عنوان مشخصه قرار مي دهيم:
کد:
function Benz(year)
{
this._year = year;
};
با اجراي اين كد فلش به صورت اتوماتيك prototype كلاس Benz را ايجاد مي كند و اين Object يك مشخصه static از كلاس Benz خواهد بود:
کد:
trace(Benz.prototype); //[object Object]
حال مشخصه اي با نام color بر روي prototype كلاس Benz ايجاد مي كنيم:
کد:
Benz.prototype.color = "White"
از اينجا به بعد كليه Object هاي ايجاد شده از كلاس Benz به دو مشخصه year_ و color دسترسي خواهند داشت اين در حالي است كه مشخصه color براي Object تعريف نشده است ولي كليه Object ها در صورت عدم داشتن مشخصه color آنرا در prototype كلاس خود جستجو مي كنند:
کد:
myBenz = new Benz(2004);
trace(myBenz._year); // 2004
trace(myBenz.color); // White
در صورتي كه Object ايجاد شده خود مشخصه color را داشته باشد prototype مرور نخواهد شد:
کد:
yourBenz = new Benz(2004);
yourBenz.color = "Black"
trace(yourBenz.color); // Black
استفاده از prototype مزاياي زيادي از جمله صرفه جويي در كد نوشته شده و همچنين مقدار حافظه گرفته شده نوسط برنامه را به همراه دارد. براي مثال اگر 1000 عدد Object از كلاس Benz ساخته شود 1000 مشخصه year_ وجود خواهد داشت، اين در حالي است كه تا هنگامي كه به صورت دستي مشخصه color را براي هر Object وارد نكنيم تنها يك مشخصه به نام color در برنامه وجود خواهد داشت.
يك مثال كاربردي:
در صورتي كه بخواهيم كليه MovieClip ها و Button ها در برنامه useHandCursor نداشته باشند كافي است اين مشخصه را در prototype قرار دهيم
کد:
Button.prototype.useHandCursor = false;
MovieClip.prototype.useHandCursor = false
و يا در صورتي كه بخواهيم تمامي MovieClip ها مشخصه اي با نام variable و برابر يك مقدار ثابت داشته باشند آنرا در prototype كلاس MovieClip قرار مي دهيم:
کد:
MovieClip.prototype.variable = 10;
مشخصه variable در تمامي برنامه وجود خواهد داشت.
كاربرد مهم ديگر prototype در ايجاد ارث بري مي باشد. اينكه چطور يك كلاس از كلاس ديگر ارث مي برد و همچنين اينكه چگونه يك Object مي تواند با prototype خود ارتباط برقرار كند و مفاهيم __proto__ و constructor را در يك پست ديگه خواهم گفت.