كي مي تونه كار prototype رو خوب توضيح بده ؟

MnavidM

Active Member
با سلام.

مثل اينكه من اشتباهي متوجه شدم :oops:

براي همين ارسالم رو ويرايش كردم .
 

fafa^mx

Member
:)!prototype يه چيز ديگس دوسته جان!ببين prototype در حقيقت يك نمونه از يك شي رو در فلش ايجاد ميكنه كر در همه سابت هستش!مثلا اين مثال خيلي كمك ميكنه تا بفهمي!
کد:
var ifd:Object = new Object()
ifd.__proto__.farid = trace("hello")

farid
اگر دقت کنی میبینی این Farid همه جا قابل دسترس هستش چون در یه جایی بالا تر از مه آبجکت ها ایجاد شده و چیزی شبیه به Global شده!حالا ما هر جا باشیم میتونیم به راحتی به Farid دسترسی داشت باشم!
مثلا این کد :
کد:
var ifd:Object = new Object()
var reza:Object = new Object()
ifd.__proto__.farid = trace("hello")


reza.farid
در این کد ما در Reza متد یا پراپرتیزی به نام Farid نساختیم اما prototype این کار رو در هر آبجکتی داشته باشیم برامون میکنه!
 

phoenix

Member
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 را در يك پست ديگه خواهم گفت.
 

fafa^mx

Member
آدم بي كار كه ميگن همينه ها!بچه تو مگه مدرسه نداري 100 صفحه هر چيزيرو توضيح ميدي :)!
 

جدیدترین ارسال ها

بالا