PDA

View Full Version : سوال: کسی میتونه بگه prototype تو JavaScript چیه؟



hezaro_yek
شنبه 26 اسفند 1391, 20:14 عصر
سلام دوستان

کسی میدونه prototype تو جاوا اسکریپت چیه؟

اگه یه مثال هم بزنید ممنون میشم.


با تشکر

Saber_Fatholahi
یک شنبه 27 اسفند 1391, 21:36 عصر
برای تعریف یک نوع جدید می توان از آن استفاده کرد مثلا مثال زیر در صورت نبودن تابعی به نام StartWith آن را پیاده سازی می کند:


typeof String.prototype.startsWith != "function" && (String.prototype.startsWith = function (n) {
return this.indexOf(n) == 0
});

hezaro_yek
پنج شنبه 01 فروردین 1392, 10:39 صبح
خیلی ممنون
ولی یه سوال دارم
جریان محتویات پرانتزی که بعد از & گذاشتی چیه؟
درست متوجه نمیشم
لطفا" راهنمایی کن
ممنون

Variable
پنج شنبه 01 فروردین 1392, 19:43 عصر
خب بزارید من اینجوری توضیح بدم که .
در جاوااسکریپت مهمترین مفهوم . مفهوم تابع است. که همه ساختار جاوااسکریپت بر پایه اون بنا میشه .
تابع رو میشه به 2 صورت استفاده کرد.
یکی برای اجرای معمولی همون تابع . ()hello
یکی هم برای ایجاد یک شی که باید از کلمه new به همراه ()hello استفاده کرد.که در این حالت به تابع میگن . سازنده. constructor...تایع رو زمانی که به صورت سازنده ازش استفاده میکنی. عملکردی شبیه به مفهوم و تعریف کلاس پیدا میکنه که میشه از روش هرچندتا شی بخای بسازی.

همه توابع در جاوااسکریپت به محض تعریف . خصوصیتی به نام prototype پیدا میکنند. که از نوع object است.که هیچ تاثیری رو تابع نداره . مگر زمانیکه از تابع به صورت سازنده ازش استفاده میکنی
وقتی شما یک تابع رو به صورت سازنده تعریف میکنی. مثله اینه که یک کلاس تعریف میکنی. میدونی که هر کلاسی داری متد و خصوصیت است.

خب شما در prototype خصوصیت های مشترک و متدهای مشترک / که بین تمام اشیا ساخته شده مشترک هستند رو قرار میدی و به اونها مقدار اولیه میدی .
که وقتی یک شی ساخته میشه مقدار خصوصیات خودش رو ست میکنه.
فقط یک نکته میمونه که متدهای تعریف شده در prototype به صورت عمومی بین همه اشیا ساخته شده از روی کلاس استفاده میشن. یعنی مثلا فقط یک تابع .tostring برای همه اشیا ساخته میشود. اینجوری میزان حافظه کمتر اتلاف میشه .یکی تابع برای همه اشیا.
با یک مثال نشونت میدم .
فکر کن میخای برای دانشگاه شریف یه برنامه بنویسی که نام و فامیل دانشجو های مقطع لیسانس رو دریافت کنه. و بعد چاپ کنه
خب نام دانشگاه و مقطع بین همه دانشجو ها یکسان هست. و همینطور عملیاتی که قرار هست انجام بده. یعنی عمل چاپ کردن.
پس چیزای مشترک رو در شی prototype قرار میدهیم..


function Student(first,last){
this.fname=first;
this.lname=last;
}
Student.prototype={
daneshgah:'sharif',
maghta:'lisans',
chap:function(){
console.log(this.fname+" "+this.lname+" "+this.daneshgah+" "+this.maghta);
}
}

بعد دوتا دانشجو میسازم و بهشون مقدار دهی میکنم. یعنی فقط نام و فامیل.
بعد از تابع چاپ برای چاپ کامل مشخصاتشون استفاده میکنیم.

var st1=new Student("mohsen","rezaei");
st1.chap();

var st2=new Student("alireza","Amiri");
st2.chap();

که چاپ میکنه
mohsen rezaei sharif lisans
alireza Amiri sharif lisans

توجه کنید من به prototype . یک شی کامل رو که حاوی خصوصیت و متد هست تخصیص دادم. روش دیگه هم اینه که تک تک خصوصیات و متدها رو تخصیص بدی به این صورت :

Student.prototype.deneshgah='sharif';
Student.prototype.maghta='lisans';
Student.prototype.chap=function(){
console.log(this.fname+" "+this.lname+" "+this.daneshgah+" "+this.maghta);
}

Variable
جمعه 02 فروردین 1392, 14:50 عصر
http://img.ir/CKy.png
شماره گذاری کردم که اول ترتیب عملیات رو بتونی تشخیص بدی
خب توضیح این کد هم این میشه که شما اول باید بدونی که زبانهای برنامه نویسی .وقتی با شرط if روبرو میشن که داخلش از && استفاده میشه .
اول پرانتز اول رو چک میکنند . اگه پرانتز اول false بود.(شماره 2) دیگه عبارت دوم روچک نمیکنند (یعنی همون پرانتز شماره 4)چون نتیجه and زمانیکه حداقل یکی از عبارات false باشه . کل نتیجه رو flase میکنه . پس منطقا دیگه نیازی به چک کردن بقیه عبارت های شرط نیست.
اما اگه شرط اول true بود. شرط یا عبارت دوم (پرانتز4) رو باز چک میکنه. ولی چون اینجا یک عبارت عملیاتی وجود. اون عبارت عملیاتی انجام میشه.
یعنی تخصیص یک مقدار (یک تابع ) به خصوصیت prototype متعلق به کلاس سازنده String