در Ø¨Ø±ÙØ§Ù ÙâÙÙÛØ³ÛØ Ø§ØºÙØ¨ اÙÙØ§Øª ٠ا Ù ÛâØ®ÙØ§ÙÛÙ Ú©Ù ÚÛØ²Û را Ø¯Ø±ÛØ§Ùت Ú©ÙÛ٠٠آ٠را گسترش دÙÛÙ .
Ø¨Ø±Ø§Û Ù
Ø«Ø§ÙØ Ù
ا ÛÚ© Ø´ÛØ¡ user ÙÙ
را٠با ÙÛÚÚ¯ÛâÙØ§ Ù Ù
ØªØ¯ÙØ§Û آ٠دارÛÙ
Ù Ù
ÛâØ®ÙØ§ÙÛÙ
admin Ù guest را ب٠عÙÙØ§Ù ÙÙ
ÙÙÙâÙØ§ÛÛ Ø§Ø² آ٠ک٠تغÛÛØ± Ú©Ù
Û Ø¯Ø§Ø±ÙØ¯ بسازÛÙ
. Ù
ا Ù
ÛâØ®ÙØ§ÙÛÙ
ÚÛØ²Û را ک٠در user دارÛÙ
را Ø¯ÙØ¨Ø§Ø±Ù Ø§Ø³ØªÙØ§Ø¯Ù Ú©ÙÛÙ
Ø Ù٠اÛÙÚ©Ù Ù
ØªØ¯ÙØ§Û آ٠را Ú©Ù¾Û/Ø¯ÙØ¨Ø§Ø±Ù Ù¾ÛØ§Ø¯ÙâØ³Ø§Ø²Û Ú©ÙÛÙ
Ø ÙÙØ· ÛÚ© Ø´ÛØ¡ Ø¬Ø¯ÛØ¯ را بر اساس آ٠بسازÛÙ
.
ÙØ±Ø§Ø«Øª Ù¾Ø±ÙØªÙتاÛÙ¾Û(prototypal inheritance) ÛÚ© ÙÛÚÚ¯Û Ø²Ø¨Ø§Ù Ø§Ø³Øª ک٠ب٠اÛÙ Ù ÙØ¶Ùع Ú©Ù Ú© Ù ÛâÚ©ÙØ¯.
ÙÛÚÚ¯Û [[Prototype]]
در Ø¬Ø§ÙØ§Ø§Ø³Ú©Ø±ÛÙ¾ØªØ Ø´ÛØ¡Ùا ÛÚ© ÙÛÚÚ¯Û Ù¾ÙÙØ§ÙÛ [[Prototype]] (دÙÛÙØ§ ÙÙ
Ø§ÙØ·Ùر ک٠در Ù
شخصات Ø²Ø¨Ø§Ù ÙØ§Ù
âÚ¯Ø°Ø§Ø±Û Ø´Ø¯Ù) Ø¯Ø§Ø±ÙØ¯ Ú©Ù ÛØ§ null است ÛØ§ Ø¨Ù Ø´ÛØ¡ دÛگر Ø±Ø¬ÙØ¹ Ù
ÛâÚ©ÙØ¯. Ø¢Ù Ø´ÛØ¡ «ÛÚ© Ù¾Ø±ÙØªÙتاÛÙ¾ (prototype)» ÙØ§Ù
ÛØ¯Ù Ù
ÛâØ´ÙØ¯:
زÙ
اÙÛ Ú©Ù Ù
ا ÛÚ© Ø´ÛØ¡ را از object Ù
ÛâØ®ÙØ§ÙÛÙ
Ù ÙØ¬Ùد ÙØ¯Ø§Ø±Ø¯Ø Ø¬Ø§ÙØ§Ø§Ø³Ú©Ø±Ûپت Ø¨Ù Ø·ÙØ± Ø®ÙØ¯Ú©Ø§Ø± آ٠را از Ù¾Ø±ÙØªÙتاÛÙ¾ Ø¯Ø±ÛØ§Ùت Ù
ÛâÚ©ÙØ¯. در Ø¨Ø±ÙØ§Ù
ÙâÙÙÛØ³ÛØ Ø¨Ù Ø§Û٠کار Â«ÙØ±Ø§Ø«Øª Ù¾Ø±ÙØªÙتاÛÙ¾Û» Ù
ÛâÚ¯ÙÛÙØ¯. Ù Ø¨Ù Ø²ÙØ¯Û Ù
ا Ù
ثاÙâÙØ§Û Ø²ÛØ§Ø¯Û از ÚÙÛÙ ÙØ±Ø§Ø«ØªÛ را Ø®ÙØ§ÙÛÙ
Ø¯ÛØ¯Ø درست Ù
اÙÙØ¯ Ø®ØµÙØµÛتâÙØ§Û Ø®ÙÙâØªØ± زبا٠ک٠بر اساس آ٠ساخت٠شدÙâØ§ÙØ¯.
ÙÛÚÚ¯Û [[Prototype]] درÙÙÛ Ù Ù¾ÙÙØ§Ù است اÙ
ا راÙâÙØ§ÛÛ Ø¨Ø±Ø§Û Ù
ÙØ¯Ø§Ø±Ø¯ÙÛ Ø¢Ù ÙØ¬Ùد دارد.
ÛÚ©Û Ø§Ø² آ٠راÙâÙØ§ Ø§Ø³ØªÙØ§Ø¯Ù از ÙØ§Ù
خاص __proto__ Ø§Ø³ØªØ Ù
Ø«ÙØ§ اÛÙÚ¯ÙÙÙ:
let animal = {
eats: true
};
let rabbit = {
jumps: true
};
rabbit.__proto__ = animal; // را ØªÙØ¸ÛÙ
Ù
ÛâÚ©ÙØ¯ rabbit.[[Prototype]] = animal
ØØ§Ùا اگر Ù
ا ÙÛÚÚ¯ÛâØ§Û Ø±Ø§ از rabbit Ø¨Ø®ÙØ§ÙÛÙ
Ù ÙØ¬Ùد ÙØ¯Ø§Ø´ØªÙ Ø¨Ø§Ø´Ø¯Ø Ø¬Ø§ÙØ§Ø§Ø³Ú©Ø±Ûپت Ø¨Ù Ø·ÙØ± Ø®ÙØ¯Ú©Ø§Ø± آ٠را از animal Ø¯Ø±ÛØ§Ùت Ù
ÛâÚ©ÙØ¯.
Ø¨Ø±Ø§Û Ù Ø«Ø§Ù:
let animal = {
eats: true
};
let rabbit = {
jumps: true
};
rabbit.__proto__ = animal; // (*)
// Ù¾ÛØ¯Ø§ Ú©ÙÛÙ
rabbit ØØ§Ùا Ù
ÛâØªÙØ§ÙÛÙ
ÙØ± د٠ÙÛÚÚ¯Û Ø±Ø§ در
alert( rabbit.eats ); // true (**)
alert( rabbit.jumps ); // true
اÛÙØ¬Ø§ خط (*) Ø´ÛØ¡ animal را ب٠عÙÙØ§Ù Ù¾Ø±ÙØªÙتاÛÙ¾ rabbit ØªÙØ¸ÛÙ
Ù
ÛâÚ©ÙØ¯.
سپس زÙ
اÙÛ Ú©Ù alert Ø³Ø¹Û Ù
ÛâÚ©ÙØ¯ تا ÙÛÚÚ¯Û rabbit.eats (**) را Ø¨Ø®ÙØ§ÙØ¯Ø Ø¯Ø±ÙÙ rabbit ÙÛØ³Øª پس Ø¬Ø§ÙØ§Ø§Ø³Ú©Ø±Ûپت Ù
رجع [[Prototype]] را Ø¯ÙØ¨Ø§Ù Ù
ÛâÚ©ÙØ¯ Ù ÙÛÚÚ¯Û Ø±Ø§ درÙÙ animal Ù¾ÛØ¯Ø§ Ù
ÛâÚ©ÙØ¯ (از پاÛÛÙ Ø¨Ù Ø¨Ø§ÙØ§ Ùگا٠کÙÛØ¯):
اÛÙØ¬Ø§ Ù
ÛâØªÙØ§ÙÛÙ
بگÙÛÛÙ
Ú©Ù âanimalâ Ù¾Ø±ÙØªÙتاÛÙ¾ rabbit است ÛØ§ ârabbitâ Ø¨Ù ØµÙØ±Øª Ù¾Ø±ÙØªÙتاÛÙ¾Û Ø§Ø² animal Ø§Ø±Ø«âØ¨Ø±Û Ú©Ø±Ø¯Ù Ø§Ø³Øª.
Ø¨ÙØ§Ø¨Ø±Ø§Û٠اگر animal تعداد Ø²ÛØ§Ø¯Û ÙÛÚÚ¯Û Ù Ù
تد Ù
ÙÛØ¯ Ø¯Ø§Ø´ØªÙ Ø¨Ø§Ø´Ø¯Ø Ø³Ù¾Ø³ Ø¢ÙâÙØ§ Ø¨Ù Ø·ÙØ± Ø®ÙØ¯Ú©Ø§Ø± درÙÙ rabbit ÙÙ
Ù
ÙØ¬Ùد Ù
ÛâØ´ÙÙØ¯. ÚÙÛÙ ÙÛÚÚ¯ÛâÙØ§ÛÛ Ø±Ø§ «Ù
ÙØ±ÙØ« ÛØ§ Ø¨Ù Ø§Ø±Ø«âØ±Ø³ÛØ¯Ù» Ù
ÛâÚ¯ÙÛÙØ¯.
اگر Ù
ا ÛÚ© Ù
تد درÙÙ animal داشت٠باشÛÙ
Ø Ù
ÛâØªÙØ§Ùد با rabbit ÙÙ
ÙØ±Ø§Ø®ÙاÙÛ Ø´ÙØ¯:
let animal = {
eats: true,
walk() {
alert("جاÙÙØ± را٠Ù
ÛâØ±ÙØ¯");
}
};
let rabbit = {
jumps: true,
__proto__: animal
};
// از Ù¾Ø±ÙØªÙتاÛÙ¾ برداشت٠شد٠است walk
rabbit.walk(); // جاÙÙØ± را٠Ù
ÛâØ±ÙØ¯
٠تد Ø¨Ù Ø·ÙØ± Ø®ÙØ¯Ú©Ø§Ø± از Ù¾Ø±ÙØªÙتاÛÙ¾ Ø¯Ø±ÛØ§Ùت Ù ÛâØ´ÙØ¯Ø ب٠اÛÙ ØµÙØ±Øª:
Ø²ÙØ¬ÛرÙâÛ Ù¾Ø±ÙØªÙتاÛÙ¾ Ù ÛâØªÙØ§Ùد Ø·ÙÙØ§ÙÛâØªØ± باشد:
let animal = {
eats: true,
walk() {
alert("جاÙÙØ± را٠Ù
ÛâØ±ÙØ¯");
}
};
let rabbit = {
jumps: true,
__proto__: animal
};
let longEar = {
earLength: 10,
__proto__: rabbit
};
// از Ø±ÙØ¬ÛرÙâÛ Ù¾Ø±ÙØªÙتاÛÙ¾ برداشت٠شد٠است walk
longEar.walk(); // جاÙÙØ± را٠Ù
ÛâØ±ÙØ¯
alert(longEar.jumps); // true (rabbit از)
ØØ§Ùا اگر Ù
ا ÚÛØ²Û را از longEar Ø¨Ø®ÙØ§ÙÛÙ
Ù ÙØ¬Ùد ÙØ¯Ø§Ø´ØªÙ Ø¨Ø§Ø´Ø¯Ø Ø¬Ø§ÙØ§Ø§Ø³Ú©Ø±Ûپت درÙÙ rabbit ٠سپس درÙÙ animal Ø¨Ù Ø¯ÙØ¨Ø§Ù Ø¢Ù Ù
Ûâگردد.
ÙÙØ· Ø¯Ù Ù ØØ¯ÙØ¯ÛØª ÙØ¬Ùد دارد:
- Ù
رجعâÙØ§ ÙÙ
ÛâØªÙØ§ÙÙØ¯ درÙÙ ÚØ±Ø®Ù ÙØ±Ø§Ø± Ø¨Ú¯ÛØ±Ùد. اگر Ù
ا ØªÙØ§Ø´ Ú©ÙÛÙ
Ú©Ù
__proto__را درÙÙ ÛÚ© ØÙÙÙ Ù ÙØ¯Ø§Ø±Ø¯ÙÛ Ú©ÙÛÙ Ø Ø¬Ø§ÙØ§Ø§Ø³Ú©Ø±Ûپت Ø§Ø±ÙØ± Ø§ÛØ¬Ø§Ø¯ Ù ÛâÚ©ÙØ¯. - Ù
ÙØ¯Ø§Ø±
__proto__Ù ÛâØªÙØ§Ùد Ø´ÛØ¡ ÛØ§nullباشد. اÙÙØ§Ø¹ دÛگر Ø¯Ø§Ø¯Ù ÙØ§Ø¯ÛØ¯Ù Ú¯Ø±ÙØªÙ Ù ÛâØ´ÙÙØ¯.
ÙÙ
ÚÙÛÙ Ù
Ù
ک٠است ÙØ§Ø¶Ø باشد اÙ
ا باز ÙÙ
: ÙÙØ· ÛÚ© [[Prototype]] Ù
ÛâØªÙØ§Ùد ÙØ¬Ùد داشت٠باشد. ÛÚ© Ø´ÛØ¡ ÙÙ
ÛâØªÙØ§Ùد از Ø¯Ù Ø´ÛØ¡ دÛگر Ø§Ø±Ø«âØ¨Ø±Û Ú©ÙØ¯.
__proto__ ÛÚ© getter/setter ÙØ¯ÛÙ
Û Ø¨Ø±Ø§Û [[Prototype]] استاÛÙ ÛÚ© Ø§Ø´ØªØ¨Ø§Ù ØªÙØ³Ø¹ÙâØ¯ÙÙØ¯Ú¯Ø§Ù تازÙâÙØ§Ø±Ø¯ است Ú©Ù ØªÙØ§Ùت Ù ÛØ§Ù اÛ٠د٠را ÙØ¯Ø§ÙÙØ¯.
ÙØ·Ùا ØªÙØ¬Ù Ú©ÙÛØ¯ Ú©Ù __proto__ با ÙÛÚÚ¯Û Ø¯Ø±ÙÙÛ [[Prototype]] Ûکسا٠ÙÛØ³Øª. اÛÙ ÙÛÚÚ¯Û ÛÚ© getter/setter Ø¨Ø±Ø§Û [[Prototype]] است. بعدا Ù
ا Ù
ÙÙØ¹ÛتâÙØ§ÛÛ Ø±Ø§ Ø®ÙØ§ÙÛÙ
Ø¯ÛØ¯ ک٠اÛÙ Ù
ÙØ¶Ùع اÙÙ
ÛØª Ø¯Ø§Ø±Ø¯Ø Ø§Ù
ا ÚÙÙ ÙÙÙ
Ø®ÙØ¯ را از Ø²Ø¨Ø§Ù Ø¬Ø§ÙØ§Ø§Ø³Ú©Ø±Ûپت Ù
ÛâØ³Ø§Ø²ÛÙ
Ø Ø¨ÛØ§ÛÛØ¯ ÙÙØ· اÛ٠را در ذÙÙ Ø®ÙØ¯ داشت٠باشÛÙ
.
ÙÛÚÚ¯Û __proto__ Ú©Ù
Û Ù
ÙØ³ÙØ® شد٠است. Ø¨ÙØ§ Ø¨Ù Ø¯ÙØ§ÛÙÛ Ù
Ø±Ø¨ÙØ· ب٠گذشت٠ÙÙÙØ² ÙØ¬Ùد Ø¯Ø§Ø±Ø¯Ø Ø¬Ø§ÙØ§Ø§Ø³Ú©Ø±Ûپت Ù
Ø¯Ø±Ù Ù¾ÛØ´ÙÙØ§Ø¯ Ù
ÛâÚ©ÙØ¯ Ú©Ù Ù
ا Ø¨Ø§ÛØ¯ از تابعâÙØ§Û Object.getPrototypeOf/Object.setPrototypeOf Ø¨Ù Ø¬Ø§Û Ø¢Ù Ø¯Ø±ÛØ§Ùت/Ù
ÙØ¯Ø§Ø±Ø¯ÙÛ Ú©Ø±Ø¯Ù Ù¾Ø±ÙØªÙتاÛÙ¾ Ø§Ø³ØªÙØ§Ø¯Ù Ú©ÙÛÙ
. اÛ٠تابعâÙØ§ را ÙÙ
در Ø¢ÛÙØ¯Ù Ù¾ÙØ´Ø´ Ù
ÛâØ¯ÙÛÙ
.
بر اساس Ù
شخصات Ø²Ø¨Ø§ÙØ __proto__ ÙÙØ· Ø¨Ø§ÛØ¯ ØªÙØ³Ø· Ù
Ø±ÙØ±Ú¯Ø±Ùا Ù¾Ø´ØªÛØ¨Ø§ÙÛ Ø´ÙØ¯. اگرÚ٠در ÙØ§Ùع تÙ
اÙ
Ù
ØÛØ·âÙØ§ شاÙ
٠سÙ
ت Ø³Ø±ÙØ± از __proto__ Ù¾Ø´ØªÛØ¨Ø§ÙÛ Ù
ÛâÚ©ÙØ¯Ø پس Ù
ا Ø¨Ø±Ø§Û Ø§Ø³ØªÙØ§Ø¯Ù از آ٠ب٠Ù
Ø´Ú©ÙÛ Ø¨Ø± ÙØ®ÙاÙÛÙ
Ø®ÙØ±Ø¯.
ب٠دÙÛ٠اÛÙÚ©Ù ÙØ´Ø§Ù __proto__ از ÙØØ§Ø¸ درک کرد٠کÙ
Û Ø¨ÛØ´ØªØ± ÙØ§Ø¶Ø Ø§Ø³ØªØ Ø¯Ø± Ù
ثاÙâÙØ§ از Ø¢Ù Ø§Ø³ØªÙØ§Ø¯Ù Ù
ÛâÚ©ÙÛÙ
.
ÙÙØ´ØªÙ از Ù¾Ø±ÙØªÙتاÛÙ¾ Ø§Ø³ØªÙØ§Ø¯Ù ÙÙ ÛâÚ©ÙØ¯
Ù¾Ø±ÙØªÙتاÛÙ¾ ÙÙØ· Ø¨Ø±Ø§Û Ø®ÙØ§Ùد٠ÙÛÚÚ¯ÛâÙØ§ Ø§Ø³ØªÙØ§Ø¯Ù Ù ÛâØ´ÙØ¯.
ع٠ÙâÙØ§Û ÙÙØ´ØªÙ/ØØ°Ù Ú©Ø±Ø¯Ù Ø¨Ù ØµÙØ±Øª ٠ستÙÛ٠با Ø´ÛØ¡ کار Ù ÛâÚ©ÙÙØ¯.
در Ù
ثا٠پاÛÛÙØ Ù
ا Ù
تد walk را در Ø®ÙØ¯ rabbit Ù
ÙØ¯Ø§Ø±Ø¯ÙÛ Ù
ÛâÚ©ÙÛÙ
:
let animal = {
eats: true,
walk() {
/* Ø§Ø³ØªÙØ§Ø¯Ù ÙØ®ÙØ§ÙØ¯ شد rabbit اÛÙ Ù
تد ØªÙØ³Ø· */
}
};
let rabbit = {
__proto__: animal
};
rabbit.walk = function() {
alert("Ø®Ø±Ú¯ÙØ´! بپر-بپر!");
};
rabbit.walk(); // !Ø®Ø±Ú¯ÙØ´! بپر-بپر
از اÛÙ Ù¾Ø³Ø ÙØ±Ø§Ø®ÙاÙÛ rabbit.walk() بدÙ٠اÛÙک٠از Ù¾Ø±ÙØªÙتاÛÙ¾ Ø§Ø³ØªÙØ§Ø¯Ù Ú©ÙØ¯Ø Ø¨ÙØ§ÙاصÙÙ Ù
تد را در Ø´ÛØ¡ Ù¾ÛØ¯Ø§ ٠آ٠را اجرا Ù
ÛâÚ©ÙØ¯:
ÙÛÚÚ¯ÛâÙØ§Û اکسسر Ø§Ø³ØªØ«ÙØ§ ÙØ³ØªÙØ¯Ø Ù ÙØ¯Ø§Ø±Ø¯ÙÛ ØªÙØ³Ø· تابع setter Ø§ÙØ¬Ø§Ù Ù ÛâØ´ÙØ¯. پس ÙÙØ´ØªÙ در ÚÙÛÙ ÙÛÚÚ¯ÛâØ§Û Ø¯Ø± ÙØ§Ùع با ÙØ±Ø§Ø®ÙاÙÛ ØªØ§Ø¨Ø¹ Ûکسا٠است.
ب٠ÙÙ
Û٠دÙÛÙ admin.fullName در کد پاÛÛÙ Ø¨Ù Ø¯Ø±Ø³ØªÛ Ú©Ø§Ø± Ù
ÛâÚ©ÙØ¯:
let user = {
name: "John",
surname: "Smith",
set fullName(value) {
[this.name, this.surname] = value.split(" ");
},
get fullName() {
return `${this.name} ${this.surname}`;
}
};
let admin = {
__proto__: user,
isAdmin: true
};
alert(admin.fullName); // John Smith (*)
// !ÙØ¹Ø§Ù Ù
ÛâØ´ÙØ¯ setter
admin.fullName = "Alice Cooper"; // (**)
alert(admin.fullName); // Alice Cooper ØØªØºÛÛØ± ÛØ§Ùت admin ÙØ¶Ø¹Ûت
alert(user.fullName); // John Smith ØØÙØ¸ شد user ÙØ¶Ø¹Ûت
اÛÙØ¬Ø§ در خط (*) ÙÛÚÚ¯Û admin.fullName در Ù¾Ø±ÙØªÙتاÛÙ¾ user Ø¯Ø§Ø±Ø§Û ÛÚ© getter Ø§Ø³ØªØ Ù¾Ø³ اÛ٠تابع ÙØ±Ø§Ø®ÙاÙÛ Ù
ÛâØ´ÙØ¯. ٠در خط (**) ÙÛÚÚ¯Û Ø¯Ø± Ù¾Ø±ÙØªÙتاÛÙ¾ Ø¯Ø§Ø±Ø§Û ÛÚ© setter است پس اÛ٠تابع ÙØ±Ø§Ø®ÙاÙÛ Ù
ÛâØ´ÙØ¯.
Ù ÙØ¯Ø§Ø± âthisâ
در Ù
Ø«Ø§Ù Ø¨Ø§ÙØ§ Ù
Ù
ک٠است ÛÚ© Ù
Ø«Ø§Ù Ø¬Ø§ÙØ¨ Ù
Ø·Ø±Ø Ø´ÙØ¯: Ù
ÙØ¯Ø§Ø± this درÙÙ set fullName(value) ÚÛØ³ØªØ ÙÛÚÚ¯ÛâÙØ§Û this.name Ù this.surname در کجا ÙÙØ´ØªÙ Ù
ÛâØ´ÙÙØ¯: درÙÙ user ÛØ§ adminØ
Ø¬ÙØ§Ø¨ ساد٠است: Ù¾Ø±ÙØªÙتاÛÙ¾âÙØ§ بر رÙÛ this ÙÛÚ ØªØ§Ø«ÛØ±Û ÙØ¯Ø§Ø±Ùد.
Ù
ÙÙ
ÙÛØ³Øª Ú©Ù Ù
تد کجا Ù¾ÛØ¯Ø§ شد٠است: درÙÙ Ø´ÛØ¡ ÛØ§ Ù¾Ø±ÙØªÙتاÛÙ¾ Ø¢Ù. در ÙØ±Ø§Ø®ÙاÙÛ ÛÚ© Ù
ØªØ¯Ø this ÙÙ
ÛØ´Ù برابر با Ø´ÛØ¡ ÙØ¨Ù از ÙÙØ·Ù است.
پس ÙØ±Ø§Ø®ÙاÙÛ setter admin.fullName= از admin ب٠عÙÙØ§Ù this Ø§Ø³ØªÙØ§Ø¯Ù Ù
ÛâÚ©ÙØ¯ ÙÙ user.
در ÙØ§Ùع اÛÙ ÛÚ© Ù ÙØ¶Ùع Ø¨Ø³ÛØ§Ø± Ù Ù٠است ÚÙ٠٠ا ٠٠ک٠است Ø´ÛØ¡Ø§Û بزرگ با Ù ØªØ¯ÙØ§ÛÛ Ø²ÛØ§Ø¯ Ù Ø´ÛØ¡ÙاÛÛ Ú©Ù Ø§Ø² Ø¢Ù Ø§Ø±Ø«âØ¨Ø±Û Ù ÛâÚ©ÙÙØ¯ داشت٠باشÛÙ . ٠ز٠اÙÛ Ú©Ù Ø´ÛØ¡ÙØ§Û ÙØ§Ø±Ø« از Ù ØªØ¯ÙØ§Û Ø¨Ù Ø§Ø±Ø«âØ¨Ø±Ø¯ÙâØ´Ø¯Ù Ø§Ø³ØªÙØ§Ø¯Ù Ù ÛâÚ©ÙÙØ¯Ø Ø¢ÙâÙØ§ ÙÙØ· ÙØ¶Ø¹Ûت Ø®ÙØ¯Ø´Ø§Ù را تغÛÛØ± Ù ÛâØ¯ÙÙØ¯ ÙÙ ÙØ¶Ø¹Ûت Ø´ÛØ¡ بزرگ را.
Ø¨Ø±Ø§Û Ù
Ø«Ø§ÙØ اÛÙØ¬Ø§ animal ÙØ´Ø§Ù دÙÙØ¯Ù ÛÚ© Â«ØØ§Ùظ٠Ù
تد» است Ù rabbit از Ø¢Ù Ø§Ø³ØªÙØ§Ø¯Ù Ù
ÛâÚ©ÙØ¯.
ÙØ±Ø§Ø®ÙاÙÛ rabbit.sleep() ÙÛÚÚ¯Û this.isSleeping را در Ø´ÛØ¡ rabbit Ù
ÙØ¯Ø§Ø±Ø¯ÙÛ Ù
ÛâÚ©ÙØ¯:
// Ù
ØªØ¯ÙØ§ÛÛ Ø¯Ø§Ø±Ø¯ animal
let animal = {
walk() {
if (!this.isSleeping) {
alert(`I walk`);
}
},
sleep() {
this.isSleeping = true;
}
};
let rabbit = {
name: "White Rabbit",
__proto__: animal
};
// را تغÛÛØ± Ù
ÛâØ¯ÙÛÙ
rabbit.isSleeping
rabbit.sleep();
alert(rabbit.isSleeping); // true
alert(animal.isSleeping); // undefined (ÚÙÛÙ ÙÛÚÚ¯ÛâØ§Û Ø¯Ø±ÙÙ Ù¾Ø±ÙØªÙتاÛÙ¾ ÙÛØ³Øª)
تصÙÛØ± ØØ§ØµÙ:
اگر Ù
ا Ø´ÛØ¡ÙØ§Û Ø¯ÛÚ¯Ø±Û ÙÙ
داشتÛÙ
Ø Ù
ث٠birdØ snake Ù ØºÛØ±ÙØ Ú©Ù Ø§Ø² animal Ø§Ø±Ø«âØ¨Ø±Û Ù
ÛâÚ©Ø±Ø¯ÙØ¯Ø Ø¢ÙâÙØ§ ÙÙ
ب٠Ù
ØªØ¯ÙØ§Û animal Ø¯Ø³ØªØ±Ø³Û Ù¾ÛØ¯Ø§ Ù
ÛâÚ©Ø±Ø¯ÙØ¯. اÙ
ا this در ÙØ± ÙØ±Ø§Ø®ÙاÙÛ Ù
ØªØ¯Ø Ø´ÛØ¡ Ù
ØªÙØ§Ø¸Ø± Ø®ÙØ§Ùد Ø¨ÙØ¯Ø ک٠در زÙ
Ø§Ù ÙØ±Ø§Ø®ÙاÙÛ Ø§Ø±Ø²ÛØ§Ø¨Û Ù
ÛâØ´ÙØ¯ (ÙØ¨Ù از ÙÙØ·Ù)Ø ÙÙ animal. پس زÙ
اÙÛ Ú©Ù Ù
ا درÙÙ this Ø¯Ø§Ø¯Ù ÙØ±Ø§Ø± Ù
ÛâØ¯ÙÛÙ
Ø Ø¯Ø±Ù٠اÛÙ Ø´ÛØ¡Ùا Ø°Ø®ÛØ±Ù Ù
ÛâØ´ÙØ¯.
در ÙØªÛØ¬ÙØ Ù ØªØ¯ÙØ§ ب٠اشتراک گذاشت٠٠ÛâØ´ÙÙØ¯Ø ا٠ا ÙØ¶Ø¹Ûت Ø´ÛØ¡ ÙÙ.
ØÙÙÙ forâ¦in
ØÙÙÙ for..in در ÙÛÚÚ¯ÛâÙØ§Û Ø¨Ù Ø§Ø±Ø«âØ¨Ø±Ø¯ÙâØ´Ø¯Ù ÙÙ
ØÙÙÙ Ù
ÛâØ²ÙØ¯.
Ø¨Ø±Ø§Û Ù Ø«Ø§Ù:
let animal = {
eats: true
};
let rabbit = {
jumps: true,
__proto__: animal
};
// ÙÙØ· Ú©ÙÛØ¯ÙØ§Û Ø®ÙØ¯ Ø´ÛØ¡ را برÙ
ÛâÚ¯Ø±Ø¯Ø§ÙØ¯ Object.keys
alert(Object.keys(rabbit)); // jumps
// ÙÙ
در Ú©ÙÛØ¯ÙØ§Û Ø®ÙØ¯ Ø´ÛØ¡ Ù ÙÙ
Ú©ÙÛØ¯ÙØ§Û Ø¨Ù Ø§Ø±Ø«âØ¨Ø±Ø¯ÙâØ´Ø¯Ù ØÙÙÙ Ù
ÛâØ²ÙÙØ¯ for..in ØÙÙÙâÙØ§Û
for(let prop in rabbit) alert(prop); // eats سپس Øjumps
اگر اÛÙ ÚÛØ²Û ÙÛØ³Øª Ú©Ù Ù
ا Ù
ÛâØ®ÙØ§ÙÛÙ
Ù Ø¯ÙØ³Øª دارÛÙ
ک٠شاÙ
Ù ÙÛÚÚ¯ÛâÙØ§Û Ø¨Ù Ø§Ø±Ø«âØ¨Ø±Ø¯ÙâØ´Ø¯Ù ÙØ´ÙØ¯Ø ÛÚ© Ù
تد درÙÙâØ³Ø§Ø®Øª obj.hasOwnProperty(key) ÙØ¬Ùد دارد: اÛÙ Ù
تد اگر obj ÙÛÚÚ¯Û Ø®ÙØ¯Ø´ (ÙÙ Ø¨Ù Ø§Ø±Ø«âØ¨Ø±Ø¯ÙâØ´Ø¯Ù) Ø¨Ù ÙØ§Ù
key را داشت٠باشد true برÙ
ÛâÚ¯Ø±Ø¯Ø§ÙØ¯.
پس Ù ÛâØªÙØ§Ùد ÙÛÚÚ¯ÛâÙØ§Û Ø¨Ù Ø§Ø±Ø«âØ¨Ø±Ø¯ÙâØ´Ø¯Ù Ø±Ø§ Ø¬Ø¯Ø§Ø³Ø§Ø²Û Ú©ÙÛÙ (ÛØ§ Ú©Ø§Ø±Û Ø¯Ûگر با Ø¢ÙâÙØ§ Ú©ÙÛÙ ):
let animal = {
eats: true
};
let rabbit = {
jumps: true,
__proto__: animal
};
for(let prop in rabbit) {
let isOwn = rabbit.hasOwnProperty(prop);
if (isOwn) {
alert(`Ø¨Ø±Ø§Û Ù
ا: ${prop}`); // jumps :Ø¨Ø±Ø§Û Ù
ا
} else {
alert(`Ø¨Ù Ø§Ø±Ø«âØ¨Ø±Ø¯ÙâØ´Ø¯Ù: ${prop}`); // eats :Ø¨Ù Ø§Ø±Ø«âØ¨Ø±Ø¯ÙâØ´Ø¯Ù
}
}
اÛÙØ¬Ø§ Ù
ا Ø²ÙØ¬ÛØ±Ù Ø§Ø±Ø«âØ¨Ø±Û Ù¾Ø§ÛÛ٠را دارÛÙ
: rabbit از animal Ø§Ø±Ø«âØ¨Ø±Û Ù
ÛâÚ©ÙØ¯ Ú©Ù Ø®ÙØ¯ آ٠از Object.prototype Ø§Ø±Ø«âØ¨Ø±Û Ù
ÛâÚ©ÙØ¯ (ÚÙÙ animal ÛÚ© Ø´ÛØ¡ ÙÛØªØ±Ø§Ù {...} Ø§Ø³ØªØ Ù¾Ø³ اÛÙ Ù
ÙØ¶Ùع Ù¾ÛØ´âÙØ±Ø¶ Ø§ÙØ¬Ø§Ù
Ù
ÛâØ´ÙØ¯) ٠سپس null در Ø¨Ø§ÙØ§Û Ø¢Ù:
در ÙØ¸Ø± Ø¯Ø§Ø´ØªÙ Ø¨Ø§Ø´ÛØ¯ Ú©Ù ÛÚ© Ù
ÙØ¶Ùع Ø¬Ø§ÙØ¨ ÙØ¬Ùد دارد. Ù
تد rabbit.hasOwnProperty از کجا Ù
ÛâØ¢ÛØ¯Ø Ù
ا آ٠را تعرÛÙ ÙکردÛÙ
. با ÙÚ¯Ø§Ù Ø¨Ù Ø²ÙØ¬Ûر٠Ù
ÛâØªÙØ§ÙÛÙ
ببÛÙÛÙ
Ú©Ù Ù
تد ØªÙØ³Ø· Object.prototype.hasOwnProperty ÙØ±Ø§ÙÙ
شدÙ. Ø¨Ù Ø¹Ø¨Ø§Ø±ØªÛ Ø¯ÛÚ¯Ø±Ø Ø¨Ù Ø§Ø±Ø« برد٠شد٠است.
â¦Ø§Ù
ا اگر for..in ÙÛÚÚ¯ÛâÙØ§Û Ø¨Ù Ø§Ø±Ø«âØ¨Ø±Ø¯ÙâØ´Ø¯Ù Ø±Ø§ ÙÛØ³Øª Ù
ÛâÚ©ÙØ¯Ø ÚØ±Ø§ hasOwnProperty Ù
ث٠eats Ù jumps ک٠در ØÙÙÙ for..in Ø¸Ø§ÙØ± Ø´Ø¯ÙØ¯Ø عÙ
Ù ÙکردØ
Ø¬ÙØ§Ø¨ ساد٠است: اÛÙ ÙÛÚÚ¯Û ØºÛØ± ÙØ§Ø¨Ù Ø´Ù
ارش است. درست Ù
Ø§ÙØ¯ تÙ
اÙ
ÙÛÚÚ¯ÛâÙØ§Û دÛگر Object.prototypeØ Ø§ÛÙ ÙÛÚÚ¯Û Ù¾Ø±ÚÙ
enumerable: false دارد. Ù for..in ÙÙØ· ÙÛÚÚ¯ÛâÙØ§Û ÙØ§Ø¨Ù Ø´Ù
ارش را ÙÛØ³Øª Ù
ÛâÚ©ÙØ¯. ب٠ÙÙ
Û٠دÙÛ٠اÛÙ ÙÛÚÚ¯Û Ù Ø¯Ûگر ÙÛÚÚ¯ÛâÙØ§Û Object.prototype ÙÛØ³Øª ÙØ´Ø¯ÙâØ§ÙØ¯.
ØªÙØ±Ûبا تÙ
اÙ
Ù
ØªØ¯ÙØ§Û Ø¯Ø±ÛØ§Ùت Ú©ÙÛØ¯/Ù
ÙØ¯Ø§Ø± دÛÚ¯Ø±Ø Ù
اÙÙØ¯ Object.keysØ Object.values ٠بÙÛÙØ ÙÛÚÚ¯ÛâÙØ§Û Ø¨Ù Ø§Ø±Ø«âØ¨Ø±Ø¯ÙâØ´Ø¯Ù Ø±Ø§ ÙØ§Ø¯Ûد٠Ù
ÛâÚ¯ÛØ±Ùد.
Ø¢ÙâÙØ§ ÙÙØ· رÙÛ Ø®ÙØ¯ Ø´ÛØ¡ کارشا٠را Ø§ÙØ¬Ø§Ù Ù ÛâØ¯ÙÙØ¯. ÙÛÚÚ¯ÛâÙØ§Û Ù¾Ø±ÙØªÙتاÛÙ¾ Ø¨Ù ØØ³Ø§Ø¨ ÙÙ ÛâØ¢ÛÙØ¯.
Ø®ÙØ§ØµÙ
- در Ø¬Ø§ÙØ§Ø§Ø³Ú©Ø±ÛÙ¾ØªØ ØªÙ
اÙ
Ø´ÛØ¡Ùا ÛÚ© ÙÛÚÚ¯Û Ù¾ÙÙØ§Ù
[[Prototype]]Ø¯Ø§Ø±ÙØ¯ Ú©Ù ÛØ§ برابر با Ø´ÛØ¡ است ÛØ§null. - Ù
ا Ù
ÛâØªÙØ§ÙÛÙ
از
obj.__proto__Ø¨Ø±Ø§Û Ø¯Ø³ØªØ±Ø³Û Ø¨Ù Ø¢Ù Ø§Ø³ØªÙØ§Ø¯Ù Ú©ÙÛÙ (ÛÚ© getter/setter ÙØ¯ÛÙ ÛØ راÙâÙØ§Û دÛÚ¯Ø±Û ÙÙ ÙØ¬Ùد دارد Ú©Ù Ø¨Ù Ø²ÙØ¯Û Ù¾ÙØ´Ø´ داد٠٠ÛâØ´ÙÙØ¯). - Ø´ÛØ¡Ø§Û Ú©Ù ØªÙØ³Ø·
[[Prototype]]Ø¨Ù Ø¢Ù Ø±Ø¬ÙØ¹ Ù ÛâØ´ÙØ¯ Â«Ù¾Ø±ÙØªÙتاÛÙ¾ (prototype)» ÙØ§Ù دارد. - اگر Ù
ا Ø¨Ø®ÙØ§ÙÛÙ
ÙÛÚÚ¯ÛâØ§Û Ø§Ø²
objرا Ø¨Ø®ÙØ§ÙÛÙ ÛØ§ Ù ØªØ¯Û Ø§Ø² آ٠را ÙØ±Ø§Ø®ÙاÙÛ Ú©ÙÛÙ Ù ÙØ¬Ùد ÙØ¯Ø§Ø´ØªÙ Ø¨Ø§Ø´Ø¯Ø Ø³Ù¾Ø³ Ø¬Ø§ÙØ§Ø§Ø³Ú©Ø±Ûپت Ø³Ø¹Û Ù ÛâÚ©ÙØ¯ ک٠آ٠را درÙÙ Ù¾Ø±ÙØªÙتاÛÙ¾ Ù¾ÛØ¯Ø§ Ú©ÙØ¯. - ع٠ÙÛØ§Øª ÙÙØ´ØªÙ/ØØ°Ù Ú©Ø±Ø¯Ù Ø¨Ù Ø·ÙØ± ٠ستÙÛ٠رÙÛ Ø´ÛØ¡ Ø§ÙØ¬Ø§Ù Ù ÛâØ´ÙÙØ¯Ø Ø¢ÙâÙØ§ از Ù¾Ø±ÙØªÙتاÛÙ¾ Ø§Ø³ØªÙØ§Ø¯Ù ÙÙ ÛâÚ©ÙÙØ¯ (با ÙØ±Ø¶ اÛÙÚ©Ù ÛÚ© ÙÛÚÚ¯Û Ø¯Ø§Ø¯ÙâØ§Û Ø§Ø³ØªØ ÙÙ ÛÚ© setter).
- اگر Ù
ا
obj.method()را ÙØ±Ø§Ø®ÙاÙÛ Ú©ÙÛÙ Ùmethodاز Ù¾Ø±ÙØªÙتاÛÙ¾ Ú¯Ø±ÙØªÙ Ø´ÙØ¯ØthisÙÙÙØ² Ù٠بÙobjØ±Ø¬ÙØ¹ Ù ÛâÚ©ÙØ¯. پس Ù ØªØ¯ÙØ§ ÙÙ ÛØ´Ù با Ø´ÛØ¡ Ú©ÙÙÙÛ Ú©Ø§Ø± Ù ÛâÚ©ÙÙØ¯ ØØªÛ اگر Ø¢ÙâÙØ§ Ø¨Ù Ø§Ø±Ø«âØ¨Ø±Ø¯ÙâØ´Ø¯Ù Ø¨Ø§Ø´ÙØ¯. - ØÙÙÙ
for..inÙ٠درÙÙ ÙÛÚÚ¯ÛâÙØ§Û Ø®ÙØ¯ Ø´ÛØ¡ Ù Ù٠درÙÙ ÙÛÚÚ¯ÛâÙØ§Û Ø¨Ù Ø§Ø±Ø«âØ¨Ø±Ø¯ÙâØ´Ø¯Ù ØÙÙÙ Ù ÛâØ²ÙØ¯. ØªÙ Ø§Ù Ù ØªØ¯ÙØ§Û Ú¯Ø±ÙØªÙ Ú©ÙÛØ¯/Ù ÙØ¯Ø§Ø± ÙÙØ· رÙÛ Ø®ÙØ¯ Ø´ÛØ¡ کارشا٠را Ø§ÙØ¬Ø§Ù Ù ÛâØ¯ÙÙØ¯.
ÙØ¸Ø±Ø§Øª
<code>Ø§Ø³ØªÙØ§Ø¯Ù Ú©ÙÛØ¯Ø Ø¨Ø±Ø§Û ÚÙØ¯Û٠خط â کد را درÙ٠تگ<pre>ÙØ±Ø§Ø± دÙÛØ¯Ø Ø¨Ø±Ø§Û Ø¨ÛØ´ از د٠خط کد â Ø§Ø² ÛÚ© جعبÙÙ Ø´ÙÛ Ø§Ø³ØªÙØ§Ø¯Ù Ú©ÙÛØ¯. (plnkrØ jsbinØ codepenâ¦)