آشنایی با جاوا اسکریپت
با سلام در خدمت شما هستیم با آموزش sysntax جاوا اسکریپت :
جاوااسکریپت توسط برندن ایش از شرکت NetScape در سال ۱۹۹۵ ساخته شد. در ابتدا به عنوان یک زبان اسکریپتنویسی در کنار جاوا (که برای موارد پیچیده تر در طراحی وب در نظر گرفته میشد) مورد استفاده بود، ولی در پی نفوذ بسیار گسترده آن در وب و همچنین پشتیبانی پیش-ساخته آن در مرورگر ها، امروزه به مراتب بیشتر از جاوا در برنامه نویسی سمت-کاربر در وب به کار برده میشود. با این حال جاوااسکریپت فقط محدود به مرورگر های وب نمیشود. Node.js پروژه ایست که یک نسخه ی مستقل از اجراکننده ی موتور جاوااسکریپت V8 از گوگل کروم را در اختیار قرار میده که هر روزه درحال محبوب تر شدن نیز هست.
// توضیحات همانند C هستند. توضیحات یک خطی با دو خط مورب شروع میشوند.,
/* و توضیحات چند خطی با خط مورب-ستاره شروع، و با ستاره-خط مورب ختم میشوند */
۱ ۲ ۳ | /* iwebpro.ir comment */ |
آخر هر دستور از ; استفاده میشه.
۱. اعداد، رشته ها و عملگرها
جاوااسکریپت فقط یک نوع عدد دارد و آن عدد اعشاری ۶۴ بیتی IEEE 754 است.
نترسید! و نگران اعداد صحیح نباشید! این اعداد اعشاری دارای ۵۴ بیت مانتیس هستند که قابلیت ذخیره ی
دقیق اعداد صحیح تا مقدار تقریبی ۹×۱۰¹⁵ را دارند.
۱ ۲ ۳ | <span class="mi">۳</span><span class="p">;</span> <span class="c1">// = ۳ </span><span class="mf">۱.۵</span><span class="p">;</span> <span class="c1">// = ۱.۵ </span> |
تمامی عملگر های محاسباتی آن طوری که انتظارش را دارید عمل خواهند کرد.
۱ ۲ ۳ ۴ ۵ | <span class="mi">۱</span> <span class="o">+</span> <span class="mi">۱</span><span class="p">;</span> <span class="c1">// = ۲ </span><span class="mi">۸</span> <span class="o">-</span> <span class="mi">۱</span><span class="p">;</span> <span class="c1">// = ۷ </span><span class="mi">۱۰</span> <span class="o">*</span> <span class="mi">۲</span><span class="p">;</span> <span class="c1">// = ۲۰ </span><span class="mi">۳۵</span> <span class="o">/</span> <span class="mi">۵</span><span class="p">;</span> <span class="c1">// = ۷ </span> |
و این حتی شامل تقسیم هم میشود.
۱ ۲ | <span class="mi">۵</span> <span class="o">/</span> <span class="mi">۲</span><span class="p">;</span> <span class="c1">// = ۲.۵ </span> |
عملگر های بیتی هم به همین شکل. وقتی از یک عملگر بیتی استفاده میکنید، عدد اعشاری شما
به عدد صحیح علامت دار *تا ۳۲ بیت* تبدیل میشود.
۱ ۲ | <span class="mi">۱</span> <span class="o"><<</span> <span class="mi">۲</span><span class="p">;</span> <span class="c1">// = ۴ </span> |
عملیات داخل پرانتز تقدم بالاتری دارند.
۱ ۲ | <span class="p">(</span><span class="mi">۱</span> <span class="o">+</span> <span class="mi">۳</span><span class="p">)</span> <span class="o">*</span> <span class="mi">۲</span><span class="p">;</span> <span class="c1">// = ۸ </span> |
سه مقدار خاص وجود دارند که در واقع مقادیر عددی نیستند:
۱ ۲ ۳ ۴ | <span class="kc">Infinity</span><span class="p">;</span> <span class="c1">// result of e.g. 1/0 </span><span class="o">-</span><span class="kc">Infinity</span><span class="p">;</span> <span class="c1">// result of e.g. -1/0 </span><span class="kc">NaN</span><span class="p">;</span> <span class="c1">// result of e.g. 0/0 </span> |
مقادیر بولی هم تعریف شده هستند:
۱ ۲ | <span class="kc">true</span><span class="p">;</span> <span class="kc">false</span><span class="p">;</span> |
رشته ها با آپستروف و یا گیومه تعریف میشوند.
۱ ۲ | <span class="s1">'abc'</span><span class="p">;</span> <span class="s2">"Hello, world"</span><span class="p">;</span> |
و منفی کردن شرط با علامت تعجب
۱ ۲ ۳ | <span class="o">!</span><span class="kc">true</span><span class="p">;</span> <span class="c1">// = false </span><span class="o">!</span><span class="kc">false</span><span class="p">;</span> <span class="c1">// = true </span> |
تساوی دو مقدار با ==
۱ ۲ ۳ | <span class="mi">۱</span> <span class="o">==</span> <span class="mi">۱</span><span class="p">;</span> <span class="c1">// = true </span><span class="mi">۲</span> <span class="o">==</span> <span class="mi">۱</span><span class="p">;</span> <span class="c1">// = false </span> |
و عدم تساوی با !=
۱ ۲ ۳ | <span class="mi">۱</span> <span class="o">!=</span> <span class="mi">۱</span><span class="p">;</span> <span class="c1">// = false </span><span class="mi">۲</span> <span class="o">!=</span> <span class="mi">۱</span><span class="p">;</span> <span class="c1">// = true </span> |
و سایر عمیلات های مقایسه
۱ ۲ ۳ ۴ ۵ | <span class="mi">۱</span> <span class="o"><</span> <span class="mi">۱۰</span><span class="p">;</span> <span class="c1">// = true </span><span class="mi">۱</span> <span class="o">></span> <span class="mi">۱۰</span><span class="p">;</span> <span class="c1">// = false </span><span class="mi">۲</span> <span class="o"><=</span> <span class="mi">۲</span><span class="p">;</span> <span class="c1">// = true </span><span class="mi">۲</span> <span class="o">>=</span> <span class="mi">۲</span><span class="p">;</span> <span class="c1">// = true </span> |
رشته ها با علامت جمع به یکدیگر متصل میشوند
۱ ۲ | <span class="s2">"Hello "</span> <span class="o">+</span> <span class="s2">"world!"</span><span class="p">;</span> <span class="c1">// = "Hello world!" </span> |
و با علامت برگتر و یا کوچکتر با یکدیگر مقایسه میشوند.
۱ ۲ | <span class="s2">"a"</span> <span class="o"><</span> <span class="s2">"b"</span><span class="p">;</span> <span class="c1">// = true </span> |
نوع متغیر برای عملیات مقایسه تطبیق داده میشود
۱ ۲ | <span class="s2">"۵"</span> <span class="o">==</span> <span class="mi">۵</span><span class="p">;</span> <span class="c1">// = true </span> |
مگر اینکه از سه مساوی استفاده شود!
۱ ۲ | <span class="s2">"۵"</span> <span class="o">===</span> <span class="mi">۵</span><span class="p">;</span> <span class="c1">// = false </span> |
با استفاده از charAt میتوانید به کارکتر های یک رشته دسترسی پیدا کنید.
۱ | <span class="s2">"This is a string"</span><span class="p">.</span><span class="nx">charAt</span><span class="p">(</span><span class="mi">۰</span><span class="p">);</span> |
از null برای نشان دادن عمدی مقدار هیج استفاده میشود.
و از undefined برای نشان دادن اینکه در حال حاظر مقدار موجود نمی باشد، هرچند خود undefined یک مقدار محسوب میشود.
۱ ۲ ۳ ۴ | <span class="kc">null</span><span class="p">;</span> <span class="c1">// used to indicate a deliberate non-value </span><span class="kc">undefined</span><span class="p">;</span> <span class="c1">// used to indicate a value is not currently present (although undefined </span> <span class="c1">// is actually a value itself) </span> |
false, null, undefined, NaN, 0 و “” مقدار نادرست و هر چیز دیگر مقدار درست طلقی میشوند.
توجه داشته باشید که ۰ نادرست و “۰” درست طلقی میشوند حتی در عبارت ۰==“۰”.
۲. متغیر ها، آرایه ها و شئ ها
متغیر ها با کلید واژه var تعریف میشوند. اشیا در جاوااسکریپت دارای نوع پویا هستند،
بدین شکل که برای تعریف نیازی به مشخص کردن نوع متعیر نیست.
برای مقدار دهی از علامت مساوی استفاده میشود.
۱ | <span class="kd">var</span> <span class="nx">someVar</span> <span class="o">=</span> <span class="mi">۵</span><span class="p">;</span> |
اگر کلید واژه var را قرار ندهید، هیچ خطایی دریافت نخواهید کرد…
۱ | <span class="nx">someOtherVar</span> <span class="o">=</span> <span class="mi">۱۰</span><span class="p">;</span> |
در عوض متغیر شما در گستره ی کل برنامه تعریف شده خواهد بود.
متغیر هایی که تعریف شده ولی مقدار دهی نشوند، دارای مقدار undefined خواهند بود.
۱ ۲ | <span class="kd">var</span> <span class="nx">someThirdVar</span><span class="p">;</span> <span class="c1">// = undefined </span> |
برای اعمال عملگر های محاسباتی، میانبر هایی وجود دارند:
۱ ۲ ۳ | <span class="nx">someVar</span> <span class="o">+=</span> <span class="mi">۵</span><span class="p">;</span> <span class="c1">// equivalent to someVar = someVar + 5; someVar is 10 now </span><span class="nx">someVar</span> <span class="o">*=</span> <span class="mi">۱۰</span><span class="p">;</span> <span class="c1">// now someVar is 100 </span> |
حتی از این هم کوتاهتر برای اضافه یا کم کردن یک عدد با مقدار یک.
۱ ۲ ۳ | <span class="nx">someVar</span><span class="o">++</span><span class="p">;</span> <span class="c1">// now someVar is 101 </span><span class="nx">someVar</span><span class="o">--</span><span class="p">;</span> <span class="c1">// back to 100 </span> |
آرایه ها در واقع لیستی مرتب شده از مقادیر مختلف از هر نوعی هستند.
۱ | <span class="kd">var</span> <span class="nx">myArray</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"Hello"</span><span class="p">,</span> <span class="mi">۴۵</span><span class="p">,</span> <span class="kc">true</span><span class="p">];</span> |
به اعضای یک آرایه میتوان از طریق قرار دادن کروشه در جلوی نام آن دسترسی پیدا کرد.
نمایه ی آرایه از صفر شروع میشود.
۱ ۲ | <span class="nx">myArray</span><span class="p">[</span><span class="mi">۱</span><span class="p">];</span> <span class="c1">// = ۴۵ </span> |
آرایه ها ناپایدار و دارای طول قابل تغییر هستند
۱ ۲ ۳ | <span class="nx">myArray</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="s2">"World"</span><span class="p">);</span> <span class="nx">myArray</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span> <span class="c1">// = ۴ </span> |
در جاوااسکریپت، اشیاء چیزی شبیه دیکشنری و یا نقشه در زبان های دیگر هستند:
یک مجموعه ی نامرتب از جفت های کلید-مقدار.
۱ | <span class="kd">var</span> <span class="nx">myObj</span> <span class="o">=</span> <span class="p">{</span><span class="na">key1</span><span class="p">:</span> <span class="s2">"Hello"</span><span class="p">,</span> <span class="na">key2</span><span class="p">:</span> <span class="s2">"World"</span><span class="p">};</span> |
کلید ها از نوع رشته هستند ولی در صورتی که مقدار معتبری برای اسم گزاری باشند نیازی به آوردن آنها درون گیومه نیست.
۱ | <span class="kd">var</span> <span class="nx">myObj</span> <span class="o">=</span> <span class="p">{</span><span class="na">myKey</span><span class="p">:</span> <span class="s2">"myValue"</span><span class="p">,</span> <span class="s2">"my other key"</span><span class="p">:</span> <span class="mi">۴</span><span class="p">};</span> |
اعضای یک شئ را نیز میتوانید با استفاده از کروشه در مقابل نام آنها استخراج کنید.
۱ ۲ | <span class="nx">myObj</span><span class="p">[</span><span class="s2">"my other key"</span><span class="p">];</span> <span class="c1">// = ۴ </span> |
…و یا از طریق نقطه در صورتی که اسم عضو مورد نظر اسم معتبری برای اسم گزاری باشد.
۱ ۲ | <span class="nx">myObj</span><span class="p">.</span><span class="nx">myKey</span><span class="p">;</span> <span class="c1">// = "myValue" </span> |
اشیاء ناپایدار و قابل اضافه کردن عضو جدید هستند.
۱ | <span class="nx">myObj</span><span class="p">.</span><span class="nx">myThirdKey</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span> |
اگر سعی کنید عضوی را که وجود ندارد استخراج کنید، مقدار undefined را دریافت خواهید کرد.
۱ ۲ | <span class="nx">myObj</span><span class="p">.</span><span class="nx">myFourthKey</span><span class="p">;</span> <span class="c1">// = undefined </span> |
۳. منطق و ساختار کنترل
ساختار if به شکلی که انتظارش را دارید کار میکند.
۱ ۲ ۳ ۴ ۵ ۶ ۷ ۸ | <span class="kd">var</span> <span class="nx">count</span> <span class="o">=</span> <span class="mi">۱</span><span class="p">;</span> <span class="k">if</span> <span class="p">(</span><span class="nx">count</span> <span class="o">==</span> <span class="mi">۳</span><span class="p">){</span> <span class="c1">// evaluated if count is 3 </span><span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="nx">count</span> <span class="o">==</span> <span class="mi">۴</span><span class="p">)</span> <span class="p">{</span> <span class="c1">// evaluated if count is 4 </span><span class="p">}</span> <span class="k">else</span> <span class="p">{</span> <span class="c1">// evaluated if it's not either 3 or 4 </span><span class="p">}</span> |
و همینطور حلقه while
۱ ۲ ۳ | <span class="k">while</span> <span class="p">(</span><span class="kc">true</span><span class="p">)</span> <span class="p">{</span> <span class="c1">// An infinite loop! </span><span class="p">}</span> |
حلقه do-while شبیه while است با این تفاوت که حداقل یکبار اجرا میشود.
۱ ۲ ۳ ۴ | <span class="kd">var</span> <span class="nx">input</span> <span class="k">do</span> <span class="p">{</span> <span class="nx">input</span> <span class="o">=</span> <span class="nx">getInput</span><span class="p">();</span> <span class="p">}</span> <span class="k">while</span> <span class="p">(</span><span class="o">!</span><span class="nx">isValid</span><span class="p">(</span><span class="nx">input</span><span class="p">))</span> |
حلقه for همانند زبان C و جاوا کار می کند.
مقدار دهی اولیه; شرط ادامه; چرخش حلقه
۱ ۲ ۳ | <span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">۰</span><span class="p">;</span> <span class="nx">i</span> <span class="o"><</span> <span class="mi">۵</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">){</span> <span class="c1">// will run 5 times </span><span class="p">}</span> |
عملگر && و || به ترتیب “و” و “یا” ی منطقی هستند.
۱ ۲ ۳ ۴ ۵ ۶ | <span class="k">if</span> <span class="p">(</span><span class="nx">house</span><span class="p">.</span><span class="nx">size</span> <span class="o">==</span> <span class="s2">"big"</span> <span class="o">&&</span> <span class="nx">house</span><span class="p">.</span><span class="nx">colour</span> <span class="o">==</span> <span class="s2">"blue"</span><span class="p">){</span> <span class="nx">house</span><span class="p">.</span><span class="nx">contains</span> <span class="o">=</span> <span class="s2">"bear"</span><span class="p">;</span> <span class="p">}</span> <span class="k">if</span> <span class="p">(</span><span class="nx">colour</span> <span class="o">==</span> <span class="s2">"red"</span> <span class="o">||</span> <span class="nx">colour</span> <span class="o">==</span> <span class="s2">"blue"</span><span class="p">){</span> <span class="c1">// colour is either red or blue </span><span class="p">}</span> |
از || همچنین میتوان برای تعیین مقدار پیشفرض استفاده کرد.
۱ | <span class="kd">var</span> <span class="nx">name</span> <span class="o">=</span> <span class="nx">otherName</span> <span class="o">||</span> <span class="s2">"default"</span><span class="p">;</span> |
۴. توابع و مفاهیم گستره و بستار
توابع در جاوااسکریپت با استفاده از کلیدواژه ی function تعریف میشوند.
۱ ۲ ۳ ۴ ۵ | <span class="kd">function</span> <span class="nx">myFunction</span><span class="p">(</span><span class="nx">thing</span><span class="p">){</span> <span class="k">return</span> <span class="nx">thing</span><span class="p">.</span><span class="nx">toUpperCase</span><span class="p">();</span> <span class="p">}</span> <span class="nx">myFunction</span><span class="p">(</span><span class="s2">"foo"</span><span class="p">);</span> <span class="c1">// = "FOO" </span> |
توابع در جاوااسکریپت نوعی شئ پایه محسوب میشوند، بنابر این می توانید آنها را به اشیاء مختلف
اضافه کنید و یا به عنوان پارامتر به توابع دیگر ارسال کنید.
– برای مثال وقتی که با یک رویداد کار میکنید.
۱ ۲ ۳ ۴ | <span class="kd">function</span> <span class="nx">myFunction</span><span class="p">(){</span> <span class="c1">// this code will be called in 5 seconds' time </span><span class="p">}</span> <span class="nx">setTimeout</span><span class="p">(</span><span class="nx">myFunction</span><span class="p">,</span> <span class="mi">۵۰۰۰</span><span class="p">);</span> |
توجه کنید که setTimeout تابعی تعریف شده در جاوااسکریپت نیست، ولی مرورگر ها و node.js از آن پشتیبانی میکنند.
توابع نیازی به داشتن اسم ندارند. برای مثال وقتی تابعی را به تابعی دیگر ارسال میکنید
میتوانید آنرا به صورت بینام تعریف کنید.
۱ ۲ ۳ | <span class="nx">setTimeout</span><span class="p">(</span><span class="kd">function</span><span class="p">(){</span> <span class="c1">// this code will be called in 5 seconds' time </span><span class="p">},</span> <span class="mi">۵۰۰۰</span><span class="p">);</span> |
توابع دارای محدوده ی متغیر های خود هستند.
بر خلاف دیگر ساختار ها – مانند if
۱ ۲ ۳ ۴ ۵ | <span class="k">if</span> <span class="p">(</span><span class="kc">true</span><span class="p">){</span> <span class="kd">var</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">۵</span><span class="p">;</span> <span class="p">}</span> <span class="nx">i</span><span class="p">;</span> <span class="c1">// = ۵ - not undefined as you'd expect in a block-scoped language </span> |
به همین دلیل الگوی خاصی به نام “تابعی که بلافاصله صدا زده میشود” پدید آمده
تا از اضافه شدن متغیر های قسمتی از برنامه به گستره ی کلی برنامه جلوگیری شود.
۱ ۲ ۳ ۴ ۵ ۶ ۷ ۸ ۹ ۱۰ | <span class="p">(</span><span class="kd">function</span><span class="p">(){</span> <span class="kd">var</span> <span class="nx">temporary</span> <span class="o">=</span> <span class="mi">۵</span><span class="p">;</span> <span class="c1">// We can access the global scope by assiging to the 'global object', which </span> <span class="c1">// in a web browser is always 'window'. The global object may have a </span> <span class="c1">// different name in non-browser environments such as Node.js. </span> <span class="nb">window</span><span class="p">.</span><span class="nx">permanent</span> <span class="o">=</span> <span class="mi">۱۰</span><span class="p">;</span> <span class="p">})();</span> <span class="nx">temporary</span><span class="p">;</span> <span class="c1">// raises ReferenceError </span><span class="nx">permanent</span><span class="p">;</span> <span class="c1">// = ۱۰ </span> |
یکی از برترین ویژگی های جاوااسکریپت مفهومی با نام بستار است
بدین شکل که اگر تابعی درون تابع دیگری تعریف شود، تابع درونی به تمام متغیر های تابع خارجی دسترسی
خواهد داشت، حتی بعد از اینکه تابع خارجی به اتمام رسیده باشد.
۱ ۲ ۳ ۴ ۵ ۶ ۷ ۸ ۹ ۱۰ ۱۱ ۱۲ ۱۳ | <span class="kd">function</span> <span class="nx">sayHelloInFiveSeconds</span><span class="p">(</span><span class="nx">name</span><span class="p">){</span> <span class="kd">var</span> <span class="nx">prompt</span> <span class="o">=</span> <span class="s2">"Hello, "</span> <span class="o">+</span> <span class="nx">name</span> <span class="o">+</span> <span class="s2">"!"</span><span class="p">;</span> <span class="kd">function</span> <span class="nx">inner</span><span class="p">(){</span> <span class="nx">alert</span><span class="p">(</span><span class="nx">prompt</span><span class="p">);</span> <span class="p">}</span> <span class="nx">setTimeout</span><span class="p">(</span><span class="nx">inner</span><span class="p">,</span> <span class="mi">۵۰۰۰</span><span class="p">);</span> <span class="c1">// setTimeout is asynchronous, so the sayHelloInFiveSeconds function will </span> <span class="c1">// exit immediately, and setTimeout will call inner afterwards. However, </span> <span class="c1">// because inner is "closed over" sayHelloInFiveSeconds, inner still has </span> <span class="c1">// access to the 'prompt' variable when it is finally called. </span><span class="p">}</span> <span class="nx">sayHelloInFiveSeconds</span><span class="p">(</span><span class="s2">"Adam"</span><span class="p">);</span> <span class="c1">// will open a popup with "Hello, Adam!" in 5s </span> |
۵. دیگر اشیاء، سازنده ها و پیشنمونه ها
اشیاء میتوانند تابع داشته باشند.
۱ ۲ ۳ ۴ ۵ ۶ ۷ | <span class="kd">var</span> <span class="nx">myObj</span> <span class="o">=</span> <span class="p">{</span> <span class="na">myFunc</span><span class="p">:</span> <span class="kd">function</span><span class="p">(){</span> <span class="k">return</span> <span class="s2">"Hello world!"</span><span class="p">;</span> <span class="p">}</span> <span class="p">};</span> <span class="nx">myObj</span><span class="p">.</span><span class="nx">myFunc</span><span class="p">();</span> <span class="c1">// = "Hello world!" </span> |
وقتی تابع یک شی صدا زده می شود، تابع میتواند به سایر مقادیر درون آن شی
از طریق کلید واژه ی this دسترسی داشته باشد.
۱ ۲ ۳ ۴ ۵ ۶ ۷ ۸ | <span class="nx">myObj</span> <span class="o">=</span> <span class="p">{</span> <span class="na">myString</span><span class="p">:</span> <span class="s2">"Hello world!"</span><span class="p">,</span> <span class="na">myFunc</span><span class="p">:</span> <span class="kd">function</span><span class="p">(){</span> <span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">myString</span><span class="p">;</span> <span class="p">}</span> <span class="p">};</span> <span class="nx">myObj</span><span class="p">.</span><span class="nx">myFunc</span><span class="p">();</span> <span class="c1">// = "Hello world!" </span> |
اینکه مقدار this چه باشد بستگی به این دارد که تابع چگونه صدا زده شود
نه اینکه تابع کجا تعریف شده است.
بنابر این تابع بالا اگر بدین شکل صدا زده شود کار نخواهد کرد
۱ ۲ ۳ | <span class="kd">var</span> <span class="nx">myFunc</span> <span class="o">=</span> <span class="nx">myObj</span><span class="p">.</span><span class="nx">myFunc</span><span class="p">;</span> <span class="nx">myFunc</span><span class="p">();</span> <span class="c1">// = undefined </span> |
به همین شکل، تابعی که در جای دیگر تعریف شده را میتوانید به یک شی الحاق کنید
و بدین ترتیب تابع میتواند به مقادیر درون شی از طریق this دسترسی پیدا کند.
۱ ۲ ۳ ۴ ۵ ۶ | <span class="kd">var</span> <span class="nx">myOtherFunc</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(){</span> <span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">myString</span><span class="p">.</span><span class="nx">toUpperCase</span><span class="p">();</span> <span class="p">}</span> <span class="nx">myObj</span><span class="p">.</span><span class="nx">myOtherFunc</span> <span class="o">=</span> <span class="nx">myOtherFunc</span><span class="p">;</span> <span class="nx">myObj</span><span class="p">.</span><span class="nx">myOtherFunc</span><span class="p">();</span> <span class="c1">// = "HELLO WORLD!" </span> |
اگر تابعی با کلید new صدا زده شوند، شی جدیدی ایجاد شده و تابع در گستره ی آن صدا زده میشود.
توابعی که بدین شکل صدا زده شوند در واقع نقش سازنده را ایفا می کنند.
۱ ۲ ۳ ۴ ۵ ۶ | <span class="kd">var</span> <span class="nx">MyConstructor</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(){</span> <span class="k">this</span><span class="p">.</span><span class="nx">myNumber</span> <span class="o">=</span> <span class="mi">۵</span><span class="p">;</span> <span class="p">}</span> <span class="nx">myNewObj</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">MyConstructor</span><span class="p">();</span> <span class="c1">// = {myNumber: 5} </span><span class="nx">myNewObj</span><span class="p">.</span><span class="nx">myNumber</span><span class="p">;</span> <span class="c1">// = ۵ </span> |
تمامی اشیاء در جاوااسکریپت دارای یک پیش نمونه هستند
به شکلی که اگر تابع صدا زده شده بر روی شی مستقیما روی آن تعریف نشده باشد
اجرا کننده ی برنامه در لیست پیش نمونه به دنبال آن تابع خواهد گشت
برخی اجرا کننده های جاوااسکریپت به شما اجازه ی دسترسی به پیش نمونه های یک شی را از
طریق عضو جادویی __proto__ میدهند.
هرچند این به شناخت پیش نمونه ها کمک میکند ولی در حیطه ی جاوااسکریپت استاندارد قرار نمیگیرد.
در ادامه شکل استاندارد پیش نمونه ها مورد بررسی قرار میگیرند.
۱ ۲ ۳ ۴ ۵ ۶ ۷ ۸ ۹ ۱۰ ۱۱ ۱۲ | <span class="kd">var</span> <span class="nx">myObj</span> <span class="o">=</span> <span class="p">{</span> <span class="na">myString</span><span class="p">:</span> <span class="s2">"Hello world!"</span><span class="p">,</span> <span class="p">};</span> <span class="kd">var</span> <span class="nx">myPrototype</span> <span class="o">=</span> <span class="p">{</span> <span class="na">meaningOfLife</span><span class="p">:</span> <span class="mi">۴۲</span><span class="p">,</span> <span class="na">myFunc</span><span class="p">:</span> <span class="kd">function</span><span class="p">(){</span> <span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">myString</span><span class="p">.</span><span class="nx">toLowerCase</span><span class="p">()</span> <span class="p">}</span> <span class="p">};</span> <span class="nx">myObj</span><span class="p">.</span><span class="nx">__proto__</span> <span class="o">=</span> <span class="nx">myPrototype</span><span class="p">;</span> <span class="nx">myObj</span><span class="p">.</span><span class="nx">meaningOfLife</span><span class="p">;</span> <span class="c1">// = ۴۲ </span> |
این موضوع در مورد توابع نیز صدق میکند.
۱ ۲ | <span class="nx">myObj</span><span class="p">.</span><span class="nx">myFunc</span><span class="p">();</span> <span class="c1">// = "hello world!" </span> |
اگر عضو مورد نظر در پیش نمونه ی شی یافت نشود، پیش نمونه ی پیش نمونه جستجو شده و الی آخر
۱ ۲ ۳ ۴ ۵ | <span class="nx">myPrototype</span><span class="p">.</span><span class="nx">__proto__</span> <span class="o">=</span> <span class="p">{</span> <span class="na">myBoolean</span><span class="p">:</span> <span class="kc">true</span> <span class="p">};</span> <span class="nx">myObj</span><span class="p">.</span><span class="nx">myBoolean</span><span class="p">;</span> <span class="c1">// = true </span> |
توجه داشته باشید که پیش نمونه ها کپی نمی شوند و هر شی جدید به پیش نمونه موجود اشاره میکند
بدین ترتیب اگر تابعی به پیش نمونه اضافه شود تمامی اشیاء میتوانند به آن دسترسی پیدا کنند.
۱ ۲ ۳ | <span class="nx">myPrototype</span><span class="p">.</span><span class="nx">meaningOfLife</span> <span class="o">=</span> <span class="mi">۴۳</span><span class="p">;</span> <span class="nx">myObj</span><span class="p">.</span><span class="nx">meaningOfLife</span><span class="p">;</span> <span class="c1">// = ۴۳ </span> |
پیش تر اشاره شد که __proto__ راه استانداردی برای دسترسی به پیش نمونه نیست و هیچ استانداردی نیز برای دسترسی به پیش نمونه ی یک شی موجود پیش بینی نشده است
ولی دو راه برای ارائه پیش نمونه برای اشیاء جدید وجود دارد.
اولی وقتیست که از تابع Object.create استفاده میشود – که اخیرا به زبان اضافه شده است و بنابراین بر روی همه ی پیاده سازی های آن وجود ندارد.
۱ ۲ ۳ | <span class="kd">var</span> <span class="nx">myObj</span> <span class="o">=</span> <span class="nb">Object</span><span class="p">.</span><span class="nx">create</span><span class="p">(</span><span class="nx">myPrototype</span><span class="p">);</span> <span class="nx">myObj</span><span class="p">.</span><span class="nx">meaningOfLife</span><span class="p">;</span> <span class="c1">// = ۴۳ </span> |
راه دوم – که همه جا قابل استفاده است – مربوط به سازنده ها می شود.
سازنده ها دارای عضوی با نام prototype هستند. این پیش نمونه ی خود سازنده نیست
بلکه پیش نمونه ایست که به تمامی اشیاء ساخته شده توسط این سازنده الحاق میشود.
۱ ۲ ۳ ۴ ۵ ۶ ۷ ۸ ۹ ۱۰ ۱۱ | <span class="nx">MyConstructor</span><span class="p">.</span><span class="nx">prototype</span> <span class="o">=</span> <span class="p">{</span> <span class="na">myNumber</span><span class="p">:</span> <span class="mi">۵</span><span class="p">,</span> <span class="na">getMyNumber</span><span class="p">:</span> <span class="kd">function</span><span class="p">(){</span> <span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">myNumber</span><span class="p">;</span> <span class="p">}</span> <span class="p">};</span> <span class="kd">var</span> <span class="nx">myNewObj2</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">MyConstructor</span><span class="p">();</span> <span class="nx">myNewObj2</span><span class="p">.</span><span class="nx">getMyNumber</span><span class="p">();</span> <span class="c1">// = ۵ </span><span class="nx">myNewObj2</span><span class="p">.</span><span class="nx">myNumber</span> <span class="o">=</span> <span class="mi">۶</span> <span class="nx">myNewObj2</span><span class="p">.</span><span class="nx">getMyNumber</span><span class="p">();</span> <span class="c1">// = ۶ </span> |
رشته ها و سایر سازنده های پیش ساخته ی زبان نیز دارای این ویژگی هستند.
۱ ۲ ۳ ۴ | <span class="kd">var</span> <span class="nx">myNumber</span> <span class="o">=</span> <span class="mi">۱۲</span><span class="p">;</span> <span class="kd">var</span> <span class="nx">myNumberObj</span> <span class="o">=</span> <span class="k">new</span> <span class="nb">Number</span><span class="p">(</span><span class="mi">۱۲</span><span class="p">);</span> <span class="nx">myNumber</span> <span class="o">==</span> <span class="nx">myNumberObj</span><span class="p">;</span> <span class="c1">// = true </span> |
به جز این که این سازنده ها دقیقا مانند سازنده های دیگر نیستند.
۱ ۲ ۳ ۴ ۵ ۶ ۷ ۸ ۹ | <span class="k">typeof</span> <span class="nx">myNumber</span><span class="p">;</span> <span class="c1">// = 'number' </span><span class="k">typeof</span> <span class="nx">myNumberObj</span><span class="p">;</span> <span class="c1">// = 'object' </span><span class="nx">myNumber</span> <span class="o">===</span> <span class="nx">myNumberObj</span><span class="p">;</span> <span class="c1">// = false </span><span class="k">if</span> <span class="p">(</span><span class="mi">۰</span><span class="p">){</span> <span class="c1">// This code won't execute, because 0 is falsy. </span><span class="p">}</span> <span class="k">if</span> <span class="p">(</span><span class="nb">Number</span><span class="p">(</span><span class="mi">۰</span><span class="p">)){</span> <span class="c1">// This code *will* execute, because Number(0) is truthy. </span><span class="p">}</span> |
ولی به هر حال هم اشیاء عادی و هم اشیاء پیش ساخته هر دو در داشتن پیش نمونه مشترک هستند
بنابر این شما میتوانید ویژگی و تابع جدیدی به رشته ها – به عنوان مثال – اضافه کنید.
گاها به از این خاصیت با عنوان پلی فیل و برای اضافه کردن ویژگی های جدید به مجموعه ای از اشیاء فعلی زبان استفاده میشود
که کاربرد فراوانی در پشتیبانی از نسخه های قدیمیتر مرورگر ها دارد.
۱ ۲ ۳ ۴ ۵ | <span class="nb">String</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">firstCharacter</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(){</span> <span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">charAt</span><span class="p">(</span><span class="mi">۰</span><span class="p">);</span> <span class="p">}</span> <span class="s2">"abc"</span><span class="p">.</span><span class="nx">firstCharacter</span><span class="p">();</span> <span class="c1">// = "a" </span> |
برای مثال، پیشتر اشاره کردیم که Object.create در نسخه های جدید پشتیبانی نشده است
ولی میتوان آن را به صورت پلی فیل استفاده کرد.
۱ ۲ ۳ ۴ ۵ ۶ ۷ ۸ ۹ | <span class="k">if</span> <span class="p">(</span><span class="nb">Object</span><span class="p">.</span><span class="nx">create</span> <span class="o">===</span> <span class="kc">undefined</span><span class="p">){</span> <span class="c1">// don't overwrite it if it exists </span> <span class="nb">Object</span><span class="p">.</span><span class="nx">create</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">proto</span><span class="p">){</span> <span class="c1">// make a temporary constructor with the right prototype </span> <span class="kd">var</span> <span class="nx">Constructor</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(){};</span> <span class="nx">Constructor</span><span class="p">.</span><span class="nx">prototype</span> <span class="o">=</span> <span class="nx">proto</span><span class="p">;</span> <span class="c1">// then use it to create a new, appropriately-prototyped object </span> <span class="k">return</span> <span class="k">new</span> <span class="nx">Constructor</span><span class="p">();</span> <span class="p">}</span> <span class="p">}</span> |
بهنام جان عالی بود