PDA

View Full Version : پروتو تایپ پویا dynamic prototype



میلاد قاضی پور
سه شنبه 31 فروردین 1389, 13:32 عصر
سلام . من با کتاب آموزش جاوا اسکریپت ( نیکلاس سی زاکاس ) دارم جاوا اسکریپت رو تمرین میکنم و در مبحث پروتوتایپهای پویا به مشکل برخوردم . کسی میتونه توضیح بده در این کد چه اتفاقی میفته یا یه منبع خوب و مفصل از جاوا اسکریپت انگلیسی یا فارسیش فرقی نمیکنه بهم معرفی کنه که بتونم این مبحث رو خوب درک کنم ؟





function car (scolor , idoors, impg)

{
this.color = scolor;
this.doors=idoors;
this.mpg=impg;
this.drivers=new array ("mike", "sue");

if (typeof car._initialized=="undefined")

car.prototype.showcolor=function() {
alert(this.color);
};
car._initialized=true;
}
}




من دقیقا میخوام بدونم اون شرط چه کاری انجام میده . اگر نوشته نشه چه اتفاقی میفته .چرا در آخر اینیشیالایزد ترو شده ؟ چرا undefined به صورت رشته نوشته شده ؟بقیشو بلدم.

alireza_s_84
سه شنبه 31 فروردین 1389, 13:50 عصر
سلام دوست عزیز:

function car (scolor , idoors, impg)
ابتدا یک کلاس (شی جدید ) به نام car تعریف شده که سازنده اون سه تا پارامتر میگیره:

this.color = scolor;
this.doors=idoors;
this.mpg=impg;
this.drivers=new array ("mike", "sue");
در اینجا اشیای داخلی کلاس با مقادیر این پارامترها مقداردهی(ارزش هی) میشین.

if (typeof car._initialized=="undefined")
در جاوا اسکریپت اشیایی که null باشند بصورت undefined شناسایی میشن پس ابتدا چک میکنه که اگر نمونه ای از شی car وجود نداشته باشه بعد (فکر میکنم یک خطی رو جا انداخته باشی اینجا باید مقدار دهی بشی شی).

car.prototype.showcolor=function() {
alert(this.color);
};
اینجا هم یک متد برای کلاس تعریف شده که اسمش showcolor هست و وقتی فراخونی بشه مقدار شی داخلی color رو نمایش میده.

car._initialized=true;
اینجا هم سازنده شی رو برابر با true قرار میده.
ولی باید بگم یک مقدار از کد بین تعریف متد و مقدار دهی سازنده پریده.
موفق باشید

میلاد قاضی پور
سه شنبه 31 فروردین 1389, 15:06 عصر
دوست عزیز ممنون از پاسخ سلیستون . کد کامل هست در اون کتاب چندین مورد از این کد هست و در مبحث وراثتش هم باز کد رو به این صورت نوشته من هم عین کد رو نوشتم همینجا . منظور شمارو از اینکه گفتید
پس ابتدا چک میکنه که اگر نمونه ای از شی car وجود نداشته باشه بعد نفهمیدم . یعنی اگر از این کلاس یک نمونه ایجاد بشه مثلا چجوریاس ... آخه اینها که رشته هستن اگر یه نمونه ایجاد بشه اون پراپرتی _initialized مگه یه متغیر خصوصی نیست اون از کجاش متوجه میشه که یه نمونه ایجاد شده یا نه من نمی تونم اینو هضم کنم بقیشو اطلاع داشتم .

alireza_s_84
سه شنبه 31 فروردین 1389, 15:34 عصر
دوست عزیز ممنون از پاسخ سلیستون . کد کامل هست در اون کتاب چندین مورد از این کد هست و در مبحث وراثتش هم باز کد رو به این صورت نوشته من هم عین کد رو نوشتم همینجا . منظور شمارو از اینکه گفتید نفهمیدم . یعنی اگر از این کلاس یک نمونه ایجاد بشه مثلا چجوریاس ... آخه اینها که رشته هستن اگر یه نمونه ایجاد بشه اون پراپرتی _initialized مگه یه متغیر خصوصی نیست اون از کجاش متوجه میشه که یه نمونه ایجاد شده یا نه من نمی تونم اینو هضم کنم بقیشو اطلاع داشتم .
سلام دوست عزیز:
این کلاس شما دو تا ایراد کوچولو داره:
یکی اینکه شی array اینجوری نوشته میشه Array و بعدش اینکه در شرط چک کردن نمونه ی ساخته شده از شی یک { جا انداخته که درستش اینجوریه:


function car(scolor , idoors, impg)
{
this.color = scolor;
this.doors=idoors;
this.mpg=impg;
this.drivers=new Array ("mike", "sue");

if (typeof car._initialized=="undefined")
{
car.prototype.showcolor=function() {
alert(this.color);
};
car._initialized=true;
}
}


نفهمیدم . یعنی اگر از این کلاس یک نمونه ایجاد بشه مثلا چجوریاس ... آخه اینها که رشته هستن اگر یه نمونه ایجاد بشه اون پراپرتی _initialized مگه یه متغیر خصوصی نیست اون از کجاش متوجه میشه که یه نمونه ایجاد شده یا نه من نمی تونم اینو هضم کنم بقیشو اطلاع داشتم .
دوست من توی شرطچک میکنه که آیا فیلد _initialized مقدار دهی شده یا نه یعنی اگر قبلا از این کلاس یک نمونه ساخته شده باشه در نتیجه این فیلد دارای مقداری غیر از undefined خواهد بود و گرنه در بدنه شرط یک نمونه از شی تعریف شده و این فیلد با مقدار true پر میشه در نتیجه در دفعات بعدی استفاده دیگه این شی مقدار دهی نخواهد شد.
خوب این فیلد متغیر خصوصی هست ولی خود کلاس مگه به فیلدهای خصوصی و عمومی دسترسی نداره؟!! اینکار توی خود بدنه کلاس داره انجام میشه و لذا مشکلی از لحاظ دسترسی وجود نداره.
شما کجاش رو هضم نمیکنی ؟؟؟

نکته نهایی: کلمه کلیدی prototype نام دیگر تابع سازنده شی هست با استفاده از این کلمه کلیدی میتونیم متها و خصوصیات جدیدی رو به اشیای از پیش ساخته شده اضافه کنیم.(دقیقا مثلا کلمه this و متدهای الحاقی در زبان #C)

میلاد قاضی پور
سه شنبه 31 فروردین 1389, 15:42 عصر
بسیار متشکر . مشکل اصلی اونجایی بود که من فکر میکردم _initialized رو کاربر تعریف کرده و یک پراپرتی هست . در کل از گفته های شما و مطالعه بیشتر خودم این برداشت رو داشتم که »

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

alireza_s_84
سه شنبه 31 فروردین 1389, 15:50 عصر
بسیار متشکر . مشکل اصلی اونجایی بود که من فکر میکردم _initialized رو کاربر تعریف کرده و یک پراپرتی هست . در کل از گفته های شما و مطالعه بیشتر خودم این برداشت رو داشتم که »

برای اینکه در هر بار ایجاد یک نسخه از شی ، برای اینکه تابع شوکالر هم هر بار ایجاد نشه و در نتیجه حافظه اضافی اشغال نشه باید چک بشه که این شی قبلا ایجاد شده یا نه . اگر ایجاد شده بود پس اون تابع هم ایجاد شده و شرط نباید برقرار باشه . اما اگر از شی یک نمونه ایجاد نشده بود ، شرط برقرار میشه و در نتیجه اولین نمونه از تابع هم ایجاد میشه .
بله ولی بهتره اینجوری بگیم چک میکنه که ایا این تابع به شی اضافه شده یا نه و اگر اضافه نشده بود
اضافه میکنه و اون متغیر initialized در واقع برای همین برابر true قرار میگیره که مشخص بشه بار اولی هست که شی ایجاد میشه یا نه.
موفق باشی