ÙØ±Ø§Ø«Øª Ú©ÙØ§Ø³ (class inheritance) راÙÛ Ø¨Ø±Ø§Û ÛÚ© Ú©ÙØ§Ø³ است تا Ú©ÙØ§Ø³ دÛÚ¯Ø±Û Ø±Ø§ تع٠ÛÙ Ø¯ÙØ¯ (extend).
پس Ù ÛâØªÙØ§ÙÛ٠ع٠Ùکرد Ø¬Ø¯ÛØ¯Û را بر اساس Ú©ÙØ§Ø³ Ù ÙØ¬Ùد بسازÛÙ .
Ú©ÙÙ Ù Ú©ÙÛØ¯Û âextendsâ
ÙØ±Ø¶ Ú©ÙÛÙ
Ù
ا Ú©ÙØ§Ø³ Animal (ب٠Ù
عÙÛ ØÛÙØ§Ù) را دارÛÙ
:
class Animal {
constructor(name) {
this.speed = 0;
this.name = name;
}
run(speed) {
this.speed = speed;
alert(`${this.name} با سرعت ${this.speed} Ù
ÛâØ¯ÙØ¯.`);
}
stop() {
this.speed = 0;
alert(`${this.name} Ø§ÛØ³ØªØ§Ø¯Ù است.`);
}
}
let animal = new Animal("جاÙÙØ± Ù
Ù");
Ù
ا Ù
ÛâØªÙØ§ÙÛÙ
Ø´ÛØ¡ animal Ù Ú©ÙØ§Ø³ Animal را اÛÙÚ¯ÙÙÙ Ø¨Ù ØµÙØ±Øª ÙÙØ¯Ø³Û ÙÙ
Ø§ÛØ´ دÙÛÙ
:
â¦Ù Ù
ا Ù
ÛâØ®ÙØ§ÙÛÙ
Ú©Ù class Rabbit دÛÚ¯Ø±Û ÙÙ
بسازÛÙ
.
ÚÙÙ Ø®Ø±Ú¯ÙØ´âÙØ§ ÙÙ
جاÙÙØ± ÙØ³ØªÙØ¯Ø Ú©ÙØ§Ø³ Rabbit (ب٠Ù
عÙÛ Ø®Ø±Ú¯ÙØ´) Ø¨Ø§ÛØ¯ بر اساس Animal باشد ٠ب٠Ù
ØªØ¯ÙØ§Û جاÙÙØ± Ø¯Ø³ØªØ±Ø³Û Ø¯Ø§Ø´ØªÙ Ø¨Ø§Ø´Ø¯ تا Ø®Ø±Ú¯ÙØ´âÙØ§ Ø¨ØªÙØ§ÙÙØ¯ Ú©Ø§Ø±Û Ú©Ù Ø¬Ø§ÙÙØ±Ø§Ù âÙ
عÙ
ÙÙÛâ Ø§ÙجاÙ
Ù
ÛâØ¯ÙÙØ¯ را Ø§ÙØ¬Ø§Ù
دÙÙØ¯.
سÛÙØªÚ©Ø³ تعÙ
ÛÙ
Ø¯Ø§Ø¯Ù Ú©ÙØ§Ø³ اÛÙÚ¯ÙÙ٠است: class Child extends Parent.
Ø¨ÛØ§ÛÛØ¯ Ú©ÙØ§Ø³ class Rabbit را بسازÛÙ
ک٠از Animal Ø§Ø±Ø«âØ¨Ø±Û Ù
ÛâÚ©ÙØ¯:
class Rabbit extends Animal {
hide() {
alert(`${this.name} ÙØ§ÛÙ
Ù
ÛâØ´ÙØ¯!`);
}
}
let rabbit = new Rabbit("Ø®Ø±Ú¯ÙØ´ سÙÛØ¯");
rabbit.run(5); // Ø®Ø±Ú¯ÙØ´ سÙÛØ¯ با سرعت 5 Ù
ÛâØ¯ÙØ¯
rabbit.hide(); // !Ø®Ø±Ú¯ÙØ´ سÙÛØ¯ ÙØ§ÛÙ
Ù
ÛâØ´ÙØ¯
Ø´ÛØ¡ ساخت٠شد٠از Ú©ÙØ§Ø³ Rabbit ÙÙ
ب٠Ù
ØªØ¯ÙØ§Û RabbitØ Ù
اÙÙØ¯ rabbit.hide()Ø Ø¯Ø³ØªØ±Ø³Û Ø¯Ø§Ø±Ø¯ Ù ÙÙ
ب٠Ù
ØªØ¯ÙØ§Û AnimalØ Ù
اÙÙØ¯ rabbit.run().
از Ø¯ÙØ±ÙØ Ú©ÙÙ
Ù Ú©ÙÛØ¯Û extends با Ø§Ø³ØªÙØ§Ø¯Ù از Ù
کاÙÛØ²Ù
âÙØ§Û Ø®ÙØ¨ Ù ÙØ¯ÛÙ
Û Ù¾Ø±ÙØªÙتاÛÙ¾ کار Ù
ÛâÚ©ÙØ¯. اÛÙ Ú©ÙÙ
Ù Rabbit.prototype.[[Prototype]] را برابر با Animal.prototype ÙØ±Ø§Ø± Ù
ÛâØ¯ÙØ¯. پس اگر Ù
ØªØ¯Û Ø¯Ø± Rabbit.prototype Ù¾ÛØ¯Ø§ ÙØ´Ø¯Ø Ø¬Ø§ÙØ§Ø§Ø³Ú©Ø±Ûپت آ٠را از Animal.prototype Ø¯Ø±ÛØ§Ùت Ù
ÛâÚ©ÙØ¯.
Ø¨Ø±Ø§Û Ù
Ø«Ø§ÙØ Ø¨Ø±Ø§Û Ù¾ÛØ¯Ø§ کرد٠Ù
تد rabbit.runØ Ù
ÙØªÙر اÛÙâÙØ§ را Ø¨Ø±Ø±Ø³Û Ù
ÛâÚ©ÙØ¯ (در تصÙÛØ± از پاÛÛÙ Ø¨Ù Ø¨Ø§ÙØ§ است):
- Ø´ÛØ¡
rabbit(runÙØ¯Ø§Ø±Ø¯). - Ù¾Ø±ÙØªÙتاÛÙ¾ Ø¢ÙØ ÛØ¹ÙÛ
Rabbit.prototype(hideرا Ø¯Ø§Ø±Ø¯Ø Ø§Ù Ø§runرا ÙÙ). - Ù¾Ø±ÙØªÙتاÛÙ¾ Ø¢ÙØ ÛØ¹ÙÛ (با ØªÙØ¬Ù بÙ
extends) Ù٠اÙAnimal.prototypeک٠در ÙÙØ§Ûت ٠تدrunرا دارد.
ÙÙ
Ø§ÙØ·Ùر ک٠از ÙØµÙ Ù¾Ø±ÙØªÙتاÛÙ¾âÙØ§Û ÙÛØªÛÙ (Native prototypes) Ø¨Ù ÛØ§Ø¯ دارÛÙ
Ø Ø®ÙØ¯ Ø¬Ø§ÙØ§Ø§Ø³Ú©Ø±Ûپت از ÙØ±Ø§Ø«Øª Ù¾Ø±ÙØªÙتاÛÙ¾Û Ø¨Ø±Ø§Û Ø´ÛØ¡ÙØ§Û Ø¯Ø±ÙÙâØ³Ø§Ø®Øª Ø§Ø³ØªÙØ§Ø¯Ù Ù
ÛâÚ©ÙØ¯. Ø¨Ø±Ø§Û Ù
ثا٠Date.prototype.[[Prototype]] برابر با Object.prototype است. ب٠ÙÙ
Û٠دÙÛ٠است Ú©Ù ØªØ§Ø±ÛØ®âÙØ§ ب٠Ù
ØªØ¯ÙØ§Û عÙ
ÙÙ
Û Ø´ÛØ¡ Ø¯Ø³ØªØ±Ø³Û Ø¯Ø§Ø±ÙØ¯.
extends Ù
جاز استسÛÙØªÚ©Ø³ Ú©ÙØ§Ø³ اجاز٠Ù
ÛâØ¯ÙØ¯ Ú©Ù Ù٠تÙÙØ§ ÛÚ© Ú©ÙØ§Ø³ بÙÚ©Ù ÙØ± Ø¹Ø¨Ø§Ø±ØªÛ Ø±Ø§ بعد از extends ÙØ±Ø§Ø± دÙÛÙ
.
Ø¨Ø±Ø§Û Ù Ø«Ø§ÙØ ÙØ±Ø§Ø®ÙاÙÛ ØªØ§Ø¨Ø¹Û Ú©Ù Ú©ÙØ§Ø³ ÙØ§Ùد را تÙÙÛØ¯ Ù ÛâÚ©ÙØ¯:
function f(phrase) {
return class {
sayHi() { alert(phrase); }
};
}
class User extends f("Ø³ÙØ§Ù
") {}
new User().sayHi(); // Ø³ÙØ§Ù
اÛÙØ¬Ø§ class User از ÙØªÛج٠f("Ø³ÙØ§Ù
") Ø§Ø±Ø«âØ¨Ø±Û Ù
ÛâÚ©ÙØ¯.
اÛÙ Ù ÙØ¶Ùع ٠٠ک٠است Ø¨Ø±Ø§Û Ø§ÙÚ¯ÙÙØ§Û Ø¨Ø±ÙØ§Ù ÙâÙÙÛØ³Û Ù¾ÛØ´Ø±Ùت٠٠ÙÛØ¯ Ø¨Ø§Ø´Ø¯Ø Ø²Ù Ø§ÙÛ Ú©Ù Ø¨Ø± اساس ÚÙØ¯ شرط ٠ا از تابعâÙØ§ Ø¨Ø±Ø§Û Ø§ÛØ¬Ø§Ø¯ Ú©ÙØ§Ø³âÙØ§ Ø§Ø³ØªÙØ§Ø¯Ù Ù ÛâÚ©ÙÛÙ Ù Ù ÛâØªÙØ§ÙÛ٠از Ø¢ÙâÙØ§ Ø§Ø±Ø«âØ¨Ø±Û Ú©ÙÛÙ .
بازÙÙÛØ³Û ٠تد
ØØ§Ùا Ø¨ÛØ§ÛÛØ¯ جÙÙØªØ± برÙÛÙ
Ù ÛÚ© Ù
تد را بازÙÙÛØ³Û Ú©ÙÛÙ
. Ø¨Ù Ø·ÙØ± Ù¾ÛØ´âÙØ±Ø¶Ø تÙ
اÙ
Ù
ØªØ¯ÙØ§ÛÛ Ú©Ù Ø¯Ø± class Rabbit Ù
شخص ÙØ´Ø¯ÙâØ§ÙØ¯ Ø¨Ù ØµÙØ±Øª Ù
ستÙÛÙ
از class Animal «بدÙ٠تغÛÛØ±Â» Ø¯Ø±ÛØ§Ùت Ù
ÛâØ´ÙÙØ¯.
اÙ
ا اگر Ù
ا Ù
تد Ø®ÙØ¯Ù
ا٠را درÙÙ Rabbit Ù
شخص Ú©ÙÛÙ
Ø Ù
ث٠stop()Ø Ø¯Ø± Ø¹ÙØ¶ اÛÙ Ù
تد Ø§Ø³ØªÙØ§Ø¯Ù Ø®ÙØ§Ùد شد:
class Rabbit extends Animal {
stop() {
// Ø§Ø³ØªÙØ§Ø¯Ù Ø®ÙØ§Ùد شد rabbit.stop() ØØ§Ùا اÛÙ Ù
تد براÛ...
// Animal از Ú©ÙØ§Ø³ stop() ب٠جاÛ
}
}
٠ع٠ÙÙØ§ ٠ا ÙÙ ÛâØ®ÙØ§ÙÛÙ Ú©Ù ÛÚ© ٠تد ÙØ§Ùد را Ø¨Ù Ø·ÙØ± Ú©ÙÛ Ø¬Ø§ÛگزÛÙ Ú©ÙÛ٠بÙÚ©Ù Ù ÛâØ®ÙØ§ÙÛÙ Ù ØªØ¯Û Ø¨Ø± اساس آ٠بسازÛ٠تا ع٠Ùکرد آ٠را تغÛÛØ± ÛØ§ گسترش بدÙÛÙ . ٠ا Ú©Ø§Ø±Û Ø±Ø§ درÙ٠٠تد Ø®ÙØ¯ Ø§ÙØ¬Ø§Ù Ù ÛâØ¯ÙÛ٠ا٠ا ٠تد ÙØ§Ùد را ÙØ¨Ù/بعد از Ø¢Ù ÛØ§ در ØÛÙ ÙØ±Ø§ÛÙØ¯ ÙØ±Ø§Ø®ÙاÙÛ Ù ÛâÚ©ÙÛÙ .
Ú©ÙØ§Ø³âÙØ§ Ú©ÙÙ
Ù Ú©ÙÛØ¯Û "super" را Ø¨Ø±Ø§Û Ø§ÛÙ Ù
ÙØ¶Ùع ÙØ±Ø§ÙÙ
Ù
ÛâÚ©ÙÙØ¯.
- Ù
تد
super.method(...)Ø¨Ø±Ø§Û ÙØ±Ø§Ø®ÙاÙÛ ÛÚ© ٠تد ÙØ§Ùد - تابع
super(...)Ø¨Ø±Ø§Û ÙØ±Ø§Ø®ÙاÙÛ Ø³Ø§Ø²ÙØ¯Ù ÙØ§Ùد (ÙÙØ· درÙÙ Ø³Ø§Ø²ÙØ¯Ù Ø®ÙØ¯Ù اÙ).
Ø¨Ø±Ø§Û Ù Ø«Ø§ÙØ Ø¨ÛØ§ÛÛØ¯ بگذارÛÙ Ø®Ø±Ú¯ÙØ´ ٠ا ز٠اÙÛ Ú©Ù Ù ÛâØ§ÛØ³ØªØ¯ Ø¨Ù Ø·ÙØ± Ø®ÙØ¯Ú©Ø§Ø± ÙØ§ÛÙ Ø´ÙØ¯:
class Animal {
constructor(name) {
this.speed = 0;
this.name = name;
}
run(speed) {
this.speed = speed;
alert(`${this.name} با سرعت ${this.speed} Ù
ÛâØ¯ÙØ¯.`);
}
stop() {
this.speed = 0;
alert(`${this.name} Ø§ÛØ³ØªØ§Ø¯Ù است.`);
}
}
class Rabbit extends Animal {
hide() {
alert(`${this.name} ÙØ§ÛÙ
Ù
ÛâØ´ÙØ¯!`);
}
stop() {
super.stop(); // ÙØ§Ùد را ÙØ±Ø§Ø®ÙاÙÛ Ú©Ù stop Ù
تد
this.hide(); // را ÙØ±Ø§Ø®ÙاÙÛ Ú©Ù hide ٠سپس
}
}
let rabbit = new Rabbit("Ø®Ø±Ú¯ÙØ´ سÙÛØ¯");
rabbit.run(5); // Ø®Ø±Ú¯ÙØ´ سÙÛØ¯ با سرعت 5 Ù
ÛâØ¯ÙØ¯
rabbit.stop(); // !Ø®Ø±Ú¯ÙØ´ سÙÛØ¯ Ø§ÛØ³ØªØ§Ø¯Ù است. Ø®Ø±Ú¯ÙØ´ سÙÛØ¯ ÙØ§ÛÙ
Ù
ÛâØ´ÙØ¯
ØØ§Ùا Rabbit Ù
تد stop را دارد ک٠در ÙØ±Ø§ÛÙØ¯ Ø®ÙØ¯Ø´ super.stop() ÙØ§Ùد را ÙØ±Ø§Ø®ÙاÙÛ Ù
ÛâÚ©ÙØ¯.
super ÙØ¯Ø§Ø±ÙدÙÙ
Ø§ÙØ·Ùر ک٠در ÙØµÙ Ø³Ø±Ú©Ø´Û Ø¯ÙØ¨Ø§Ø±Ù از تابعâÙØ§Û Ú©Ù
اÙÛ Ú¯ÙØªÙ Ø´Ø¯Ø ØªØ§Ø¨Ø¹âÙØ§Û Ú©Ù
اÙÛ super ÙØ¯Ø§Ø±Ùد.
اگر Ø¨Ù Ø¢Ù Ø¯Ø³ØªØ±Ø³Û Ù¾ÛØ¯Ø§ Ú©ÙÛÙ Ø Ø§Ø² تابع Ø¨ÛØ±ÙÙÛ Ú¯Ø±ÙØªÙ Ù ÛâØ´ÙØ¯. Ø¨Ø±Ø§Û Ù Ø«Ø§Ù:
class Rabbit extends Animal {
stop() {
setTimeout(() => super.stop(), 1000); // ÙØ§Ùد بعد از 1 ثاÙÛÙ stop ÙØ±Ø§Ø®ÙاÙÛ
}
}
Ù
ÙØ¯Ø§Ø± super در تابع Ú©Ù
اÙÛ Ø¨Ø§ Ù
ÙØ¯Ø§Ø± آ٠در stop() Ûکسا٠است Ù ÙÙ
Ø§ÙØ·Ùر ک٠تÙÙØ¹ Ù
ÛâØ±ÙØ¯ کار Ù
ÛâÚ©ÙØ¯. اگر Ù
ا ÛÚ© تابع «Ù
عÙ
ÙÙÛ» را اÛÙØ¬Ø§ Ù
شخص Ú©Ø±Ø¯Ù Ø¨ÙØ¯ÛÙ
Ø Ø§Ø±ÙØ± Ø§ÛØ¬Ø§Ø¯ Ù
ÛâØ´Ø¯:
// ØºÛØ±Ù
ÙØªØ¸Ø±Ù super
setTimeout(function() { super.stop() }, 1000);
بازÙÙÛØ³Û Ø³Ø§Ø²ÙØ¯Ù
با Ø³Ø§Ø²ÙØ¯ÙâÙØ§ اÛ٠کار Ú©Ù Û Ù¾ÛÚÛØ¯Ù Ù ÛâØ´ÙØ¯.
تا ØØ§ÙØ§Ø Rabbit تابع constructor Ø®ÙØ¯Ø´ را ÙØ¯Ø§Ø´Øª.
با ØªÙØ¬Ù ب٠Ù
شخصات Ø²Ø¨Ø§ÙØ اگر Ú©ÙØ§Ø³Û ÛÚ© Ú©ÙØ§Ø³ دÛگر را تعÙ
ÛÙ
Ø¯ÙØ¯ Ù constructor ÙØ¯Ø§Ø´ØªÙ Ø¨Ø§Ø´Ø¯Ø Ø³Ù¾Ø³ constructor «خاÙÛ» Ø²ÛØ± Ø§ÛØ¬Ø§Ø¯ Ù
ÛâØ´ÙØ¯:
class Rabbit extends Animal {
// Ø¨Ø±Ø§Û ØªÙØ§Ø¨Ø¹Û ک٠بدÙÙ Ø³Ø§Ø²ÙØ¯Ù Ø®ÙØ¯Ø´Ø§Ù تعÙ
ÛÙ
داد٠Ù
ÛâØ´ÙÙØ¯ Ø§ÛØ¬Ø§Ø¯ Ù
ÛâØ´ÙØ¯
constructor(...args) {
super(...args);
}
}
ÙÙ
Ø§ÙØ·Ùر Ú©Ù Ù
ÛâØªÙØ§ÙÛÙ
ببÛÙÛÙ
Ø Ø§ÛÙ Ø³Ø§Ø²ÙØ¯Ù با پاس داد٠تÙ
اÙ
آرگÙÙ
اÙâÙØ§ constructor ÙØ§Ùد را ÙØ±Ø§Ø®ÙاÙÛ Ù
ÛâÚ©ÙØ¯. اگر Ù
ا Ø³Ø§Ø²ÙØ¯Ù Ø®ÙØ¯Ù
ا٠را ÙÙÙÛØ³ÛÙ
اÛÙ Ø§ØªÙØ§Ù Ù
ÛâØ§ÙØªØ¯.
ØØ§Ùا Ø¨ÛØ§ÛÛØ¯ ÛÚ© Ø³Ø§Ø²ÙØ¯Ù Ø³ÙØ§Ø±Ø´Û ب٠Rabbit اضاÙÙ Ú©ÙÛÙ
. اÛÙ Ø³Ø§Ø²ÙØ¯Ù Ø¹ÙØ§Ù٠بر name ÙÛÚÚ¯Û earLength را ÙÙ
Ù
شخص Ù
ÛâÚ©ÙØ¯:
class Animal {
constructor(name) {
this.speed = 0;
this.name = name;
}
// ...
}
class Rabbit extends Animal {
constructor(name, earLength) {
this.speed = 0;
this.name = name;
this.earLength = earLength;
}
// ...
}
// !کار ÙÙ
ÛâÚ©ÙØ¯
let rabbit = new Rabbit("Ø®Ø±Ú¯ÙØ´ سÙÛØ¯", 10); // تعرÛÙ ÙØ´Ø¯Ù است this :Ø§Ø±ÙØ±
Ø§Û ÙØ§Û! Ø§Ø±ÙØ± Ú¯Ø±ÙØªÛÙ . ØØ§Ùا ÙÙ ÛâØªÙØ§ÙÛÙ Ø®Ø±Ú¯ÙØ´Û بسازÛÙ . ÚÙ ÚÛØ²Û اشتبا٠استØ
Ø¬ÙØ§Ø¨ Ú©ÙØªØ§Ù:
- Ø³Ø§Ø²ÙØ¯ÙâÙØ§Û درÙÙ Ú©ÙØ§Ø³âÙØ§Û Ø§Ø±Ø«âØ¨Ø± Ø¨Ø§ÛØ¯
super(...)را ÙØ±Ø§Ø®ÙاÙÛ Ú©ÙÙØ¯ Ù (!) ÙØ¨Ù از Ø§Ø³ØªÙØ§Ø¯Ù ازthisاÛ٠کار را Ø§ÙØ¬Ø§Ù دÙÙØ¯.
â¦Ø§Ù ا ÚØ±Ø§Ø ÚÙ ÚÛØ²Û در ØØ§Ù Ø§ØªÙØ§Ù Ø§ÙØªØ§Ø¯Ù Ø§Ø³ØªØ ÙØ§Ùعا ÚÛØ²Û Ú©Ù ÙØ§Ø²Ù است Ø¹Ø¬ÛØ¨ Ø¨Ù ÙØ¸Ø± Ù ÛâØ±Ø³Ø¯.
ÙØ·Ø¹Ø§ ØªÙØ¶ÛØÛ ÙØ¬Ùد دارد. Ø¨ÛØ§ÛÛØ¯ ÙØ§Ø±Ø¯ Ø¬Ø²Ø¦ÛØ§Øª Ø´ÙÛ٠تا ش٠ا Ú©Ø§Ù ÙØ§ Ù ØªÙØ¬Ù Ø´ÙÛØ¯ Ú©Ù ÚÙ ÚÛØ²Û در ØØ§Ù رخ داد٠است.
در Ø¬Ø§ÙØ§Ø§Ø³Ú©Ø±ÛÙ¾ØªØ ØªÙØ§ÙØªÛ Ø¨Û٠تابع Ø³Ø§Ø²ÙØ¯Ù ÛÚ© Ú©ÙØ§Ø³ Ø§Ø±Ø«âØ¨Ø± (Ø¨Ù Â«Ø³Ø§Ø²ÙØ¯Ù Ù
شت٠شدÙ» ÙÙ
Ø´ÙØ§Ø®ØªÙ Ù
ÛâØ´ÙØ¯) ٠بÙÛ٠تابعâÙØ§ ÙØ¬Ùد دارد. Ø³Ø§Ø²ÙØ¯Ù Ù
شت٠شد٠ÛÚ© ÙÛÚÚ¯Û Ø¯Ø±ÙÙÛ Ø®Ø§Øµ [[ConstructorKind]]:"derived" را دارد. اÛÙ ÛÚ© Ø¨Ø±ÚØ³Ø¨ درÙÙÛ Ø®Ø§Øµ است.
اÛÙ Ø¨Ø±ÚØ³Ø¨ بر Ø±ÙØªØ§Ø± Ø¢Ù ÙÙ
را٠با new ØªØ£Ø«ÛØ± Ù
Ûâگذارد.
- زÙ
اÙÛ Ú©Ù ÛÚ© تابع Ù
عÙ
ÙÙÛ ÙÙ
را٠با
newاجرا Ù ÛâØ´ÙØ¯Ø Ø´ÛØ¡Ø§Û خاÙÛ Ù ÛâØ³Ø§Ø²Ø¯ Ùthisرا برابر با Ø¢Ù ÙØ±Ø§Ø± Ù ÛâØ¯ÙØ¯. - ا٠ا ز٠اÙÛ Ú©Ù ÛÚ© Ø³Ø§Ø²ÙØ¯Ù ٠شت٠شد٠اجرا Ù ÛâØ´ÙØ¯Ø اÛ٠کار را ÙÙ ÛâÚ©ÙØ¯. اÛÙ Ø³Ø§Ø²ÙØ¯Ù تÙÙØ¹ دارد Ú©Ù Ø³Ø§Ø²ÙØ¯Ù ÙØ§Ùد اÛ٠کار را Ø§ÙØ¬Ø§Ù Ø¯ÙØ¯.
پس ÛÚ© Ø³Ø§Ø²ÙØ¯Ù Ù
Ø´ØªÙ Ø´Ø¯Ù Ø¨Ø§ÛØ¯ super را Ø¨Ø±Ø§Û Ø§Ø¬Ø±Ø§Û Ø³Ø§Ø²ÙØ¯Ù ÙØ§Ùد (پاÛÙ) Ø®ÙØ¯ ÙØ±Ø§Ø®ÙاÙÛ Ú©ÙØ¯Ø در ØºÛØ± اÛÙ ØµÙØ±Øª Ø´ÛØ¡Ø§Û Ø¨Ø±Ø§Û this Ø³Ø§Ø®ØªÙ ÙØ®ÙØ§ÙØ¯ شد. Ù Ù
ا Ø§Ø±ÙØ± Ø¯Ø±ÛØ§Ùت Ø®ÙØ§ÙÛÙ
کرد.
Ø¨Ø±Ø§Û Ø§ÛÙÚ©Ù Ø³Ø§Ø²ÙØ¯Ù Rabbit کار Ú©ÙØ¯Ø Ø¨Ø§ÛØ¯ ÙØ¨Ù از Ø§Ø³ØªÙØ§Ø¯Ù کرد٠از this تابع super() را ÙØ±Ø§Ø®ÙاÙÛ Ú©ÙØ¯Ø Ù
اÙÙØ¯ اÛÙØ¬Ø§:
class Animal {
constructor(name) {
this.speed = 0;
this.name = name;
}
// ...
}
class Rabbit extends Animal {
constructor(name, earLength) {
super(name);
this.earLength = earLength;
}
// ...
}
// ØØ§Ùا درست است
let rabbit = new Rabbit("Ø®Ø±Ú¯ÙØ´ سÙÛØ¯", 10);
alert(rabbit.name); // Ø®Ø±Ú¯ÙØ´ سÙÛØ¯
alert(rabbit.earLength); // 10
بازÙÙÛØ³Û ÙÛÙØ¯ÙØ§Û Ú©ÙØ§Ø³: ÙکتÙâØ§Û ÙØ±ÛØ¨ÙØ¯Ù
اÛÙ ÙÚ©ØªÙ ÙØ±Ø¶ Ù ÛâÚ©ÙØ¯ ش٠ا Ø¯Ø±Ø¨Ø§Ø±Ù Ú©ÙØ§Ø³âÙØ§ Ù ÙØ¯Ø§Ø±Û ØªØ¬Ø±Ø¨Ù Ø¯Ø§Ø±ÛØ¯Ø Ø´Ø§ÛØ¯ در زباÙâÙØ§Û Ø¨Ø±ÙØ§Ù ÙâÙÙÛØ³Û دÛگر.
اÛÙ Ùکت٠باعث بÛÙØ´ Ø¨ÙØªØ± درÙ٠زبا٠٠ÛâØ´ÙØ¯ Ù ÙÙ ÚÙÛÙ Ø±ÙØªØ§Ø±Û را ک٠٠٠ک٠است Ù ÙØ´Ø§ باگâÙØ§ باشد (ا٠ا ÙÙ Ø§ØºÙØ¨ اÙÙØ§Øª) را ØªÙØ¶ÛØ Ù ÛâØ¯ÙØ¯.
اگر ÙÙÙ ÛØ¯Ù آ٠است Ø¨Ø±Ø§Û Ø´Ù Ø§ سخت Ø§Ø³ØªØ ÙÙØ· جÙ٠برÙÛØ¯Ø Ø¨Ù Ø®ÙØ§Ùد٠ادا٠٠دÙÛØ¯Ø سپس پس Ù Ø¯ØªÛ Ø¨Ù Ø³Ø±Ø§Øº Ø¢Ù Ø¨ÛØ§ÛÛØ¯.
٠ا Ù٠تÙÙØ§ Ù ÛâØªÙØ§ÙÛÙ Ù ØªØ¯ÙØ§ را بازÙÙÛØ³Û Ú©ÙÛÙ Ø Ø¨ÙÚ©Ù ÙÛÙØ¯ÙØ§Û Ú©ÙØ§Ø³ را ÙÙ Ù ÛâØªÙØ§ÙÛÙ .
اگرÚ٠ز٠اÙÛ Ú©Ù Ù Ø§ ب٠ÛÚ© ÙÛÙØ¯ بازÙÙÛØ³Û شد٠درÙÙ Ø³Ø§Ø²ÙØ¯Ù ÙØ§Ùد Ø¯Ø³ØªØ±Ø³Û Ù¾ÛØ¯Ø§ Ù ÛâÚ©ÙÛÙ Ø±ÙØªØ§Ø±Û Ø¹Ø¬ÛØ¨ ÙØ¬Ùد دارد Ú©Ù ÙØ³Ø¨Øª ب٠اکثر زباÙâÙØ§Û Ø¨Ø±ÙØ§Ù ÙâÙÙÛØ³Û دÛگر Ø®ÛÙÛ ØªÙØ§Ùت دارد.
اÛ٠٠ثا٠را در ÙØ¸Ø± Ø¨Ú¯ÛØ±Ûد:
class Animal {
name = 'animal';
constructor() {
alert(this.name); // (*)
}
}
class Rabbit extends Animal {
name = 'rabbit';
}
new Animal(); // animal
new Rabbit(); // animal
اÛÙØ¬Ø§Ø Ú©ÙØ§Ø³ Rabbit Ú©ÙØ§Ø³ Animal را تعÙ
ÛÙ
Ù
ÛâØ¯ÙØ¯ Ù ÙÛÙØ¯ name را با Ù
ÙØ¯Ø§Ø± Ø®ÙØ¯Ø´ بازÙÙÛØ³Û Ù
ÛâÚ©ÙØ¯.
ÙÛÚ Ø³Ø§Ø²ÙØ¯ÙâØ§Û Ø¯Ø±ÙÙ Rabbit ÙØ¬Ùد ÙØ¯Ø§Ø±Ø¯Ø پس سازد٠Animal ÙØ±Ø§Ø®ÙاÙÛ Ù
ÛâØ´ÙØ¯.
Ù
ÙØ¶Ùع Ø¬Ø§ÙØ¨ اÛ٠است ک٠در ÙØ± د٠Ù
ÙØ±Ø¯: new Animal() Ù new Rabbit()Ø ØªØ§Ø¨Ø¹ alert در خط (*) Ù
ÙØ¯Ø§Ø± animal را ÙØ´Ø§Ù Ù
ÛâØ¯ÙØ¯.
Ø¨Ù Ø¹Ø¨Ø§Ø±ØªÛ Ø¯ÛÚ¯Ø±Ø Ø³Ø§Ø²ÙØ¯Ù ÙØ§Ùد ÙÙ ÛØ´Ù از Ù ÙØ¯Ø§Ø± ÙÛÙØ¯ Ø®ÙØ¯Ø´ Ø§Ø³ØªÙØ§Ø¯Ù Ù ÛâÚ©ÙØ¯Ø ÙÙ ÙÛÙØ¯ بازÙÙÛØ³Û شدÙ.
ÚÙ ÚÛØ²Û دربار٠اÛÙ Ø¹Ø¬ÛØ¨ استØ
اگر ÙÙÙØ² ÙØ§Ø¶Ø ÙÛØ³ØªØ ÙØ·Ùا با Ù ØªØ¯ÙØ§ Ù ÙØ§Ûس٠کÙÛØ¯.
اÛÙØ¬Ø§ Ú©Ø¯Û Ù
شاب٠دارÛÙ
اÙ
ا Ø¨Ù Ø¬Ø§Û this.name Ù
ا Ù
تد this.showName() را ÙØ±Ø§Ø®ÙاÙÛ Ù
ÛâÚ©ÙÛÙ
:
class Animal {
showName() { // this.name = 'animal' ب٠جاÛ
alert('animal');
}
constructor() {
this.showName(); // alert(this.name); ب٠جاÛ
}
}
class Rabbit extends Animal {
showName() {
alert('rabbit');
}
}
new Animal(); // animal
new Rabbit(); // rabbit
ÙØ·Ùا ØªÙØ¬Ù Ú©ÙÛØ¯: ØØ§Ùا Ø®Ø±ÙØ¬Û ÙØ±Ù دارد.
٠اÛÙ ÚÛØ²Û است ک٠٠ا Ø·Ø¨ÛØ¹ØªØ§ تÙÙØ¹ دارÛÙ . ز٠اÙÛ Ú©Ù Ø³Ø§Ø²ÙØ¯Ù ÙØ§Ùد در Ú©ÙØ§Ø³ Ù Ø´ØªÙ Ø´Ø¯Ù ÙØ±Ø§Ø®ÙاÙÛ Ù ÛâØ´ÙØ¯Ø از ٠تد بازÙÙÛØ³Û Ø´Ø¯Ù Ø§Ø³ØªÙØ§Ø¯Ù Ù ÛâÚ©ÙØ¯.
â¦Ø§Ù ا Ø¨Ø±Ø§Û ÙÛÙØ¯ÙØ§Û Ú©ÙØ§Ø³ اÛÙÚ¯ÙÙÙ ÙÛØ³Øª. ÙÙ Ø§ÙØ·Ùر Ú©Ù Ú¯ÙØªÙ Ø´Ø¯Ø Ø³Ø§Ø²ÙØ¯Ù ÙØ§Ùد ÙÙ ÛØ´Ù از ÙÛÙØ¯ ÙØ§Ùد Ø§Ø³ØªÙØ§Ø¯Ù Ù ÛâÚ©ÙØ¯.
ÚØ±Ø§ ØªÙØ§Ùت ÙØ¬Ùد داردØ
خب دÙÛ٠آ٠درÙÙ ØªØ±ØªÛØ¨ Ù ÙØ¯Ø§Ø±Ø¯ÙÛ Ø§ÙÙÛ٠ب٠ÙÛÙØ¯Ùا است. ÙÛÙØ¯ Ú©ÙØ§Ø³ اÛÙÚ¯ÙÙÙ Ù ÙØ¯Ø§Ø±Ø¯ÙÛ Ø§ÙÙÛÙ Ù ÛâØ´ÙØ¯:
- ÙØ¨Ù از Ø³Ø§Ø²ÙØ¯Ù Ø¨Ø±Ø§Û Ú©ÙØ§Ø³ پاÛÙ (Ú©Ù ÚÛØ²Û را تع٠ÛÙ ÙÙ ÛâØ¯ÙØ¯)Ø
- Ø¨ÙØ§ÙاصÙ٠بعد از
super()Ø¨Ø±Ø§Û Ú©ÙØ§Ø³ ٠شت٠شدÙ.
در اÛÙ Ù
ÙØ±Ø¯ Ù
Ø§Ø Rabbit Ú©ÙØ§Ø³ Ù
شت٠شد٠است. تابع constructor() درÙÙ Ø¢Ù ÙØ¬Ùد ÙØ¯Ø§Ø±Ø¯. ÙÙ
Ø§ÙØ·Ùر Ú©Ù ÙØ¨Ùا ÙÙ
Ú¯ÙØªÙ Ø´Ø¯Ø Ø¯Ø±Ø³Øª Ù
اÙÙØ¯ اÛ٠است Ú©Ù ÛÚ© Ø³Ø§Ø²ÙØ¯Ù خاÙÛ ÙÙØ· ØØ§ÙÛ super(...args) ÙØ¬Ùد داشت٠باشد.
پس new Rabbit() تابع super() را ÙØ±Ø§Ø®ÙاÙÛ Ù
ÛâÚ©ÙØ¯Ø ب٠ÙÙ
ÛÙ ØªØ±ØªÛØ¨ Ø³Ø§Ø²ÙØ¯Ù ÙØ§Ùد را اجرا Ù
ÛâÚ©ÙØ¯ Ù (Ø¨ÙØ§ ب٠دÙÛÙ Ù
ÙØ¬Ùد Ø¨Ø±Ø§Û Ú©ÙØ§Ø³âÙØ§Û Ù
شت٠شدÙ) ÙÙØ· بعد از Ø¢Ù ÙÛÙØ¯ÙØ§Û Ú©ÙØ§Ø³ Ø®ÙØ¯Ø´ Ù
ÙØ¯Ø§Ø±Ø¯ÙÛ Ø§ÙÙÛÙ Ù
ÛâØ´ÙÙØ¯. در زÙ
Ø§Ù Ø§Ø¬Ø±Ø§Û Ø³Ø§Ø²ÙØ¯Ù ÙØ§ÙØ¯Ø ÙÛÙØ¯ÙØ§Û Ú©ÙØ§Ø³ Rabbit ÙÙÙØ² ÙØ¬Ùد ÙØ¯Ø§Ø±ÙØ¯Ø Ø¨Ù ÙÙ
Û٠دÙÛÙ ÙÛÙØ¯ÙØ§Û Animal Ø§Ø³ØªÙØ§Ø¯Ù Ù
ÛâØ´ÙÙØ¯.
اÛÙ ØªÙØ§Ùت Ø¬Ø²Ø¦Û Ø¨ÛÙ ÙÛÙØ¯Ùا Ù Ù ØªØ¯ÙØ§ ٠ختص Ø¨Ù Ø¬Ø§ÙØ§Ø§Ø³Ú©Ø±Ûپت است.
Ø®ÙØ´Ø¨Ø®ØªØ§Ù٠اÛÙ Ù ÙØ¶Ùع ÙÙØ· ز٠اÙÛ Ø®ÙØ¯Ø´ را ÙØ´Ø§Ù Ù ÛâØ¯ÙØ¯ Ú©Ù ÛÚ© ÙÛÙØ¯ بازÙÙÛØ³Û شد٠درÙÙ Ø³Ø§Ø²ÙØ¯Ù ÙØ§Ùد Ø§Ø³ØªÙØ§Ø¯Ù شد٠باشد. سپس ٠٠ک٠است ÙÙÙ ÛØ¯Ù اÛÙÚ©Ù ÚÙ ÚÛØ²Û در ØØ§Ù رخ داد٠است Ø¯Ø´ÙØ§Ø± Ø¨Ø§Ø´Ø¯Ø Ø¨Ù ÙÙ Û٠دÙÛ٠اÛÙØ¬Ø§ آ٠را ØªÙØ¶ÛØ Ø¯Ø§Ø¯ÛÙ .
اگر اÛÙ Ù Ø´Ú©ÙÛ Ø§ÛØ¬Ø§Ø¯ Ú©ÙØ¯Ø Ù ÛâØªÙØ§ÙÛØ¯ با Ø§Ø³ØªÙØ§Ø¯Ù از Ù ØªØ¯ÙØ§ ÛØ§ getter/setterÙØ§ Ø¨Ù Ø¬Ø§Û ÙÛÙØ¯Ùا آ٠را برطر٠کÙÛØ¯.
تابع Super: از درÙÙØ [[HomeObject]]
اگر اÙÙÛ٠بار است ک٠اÛÙ Ø¢Ù ÙØ²Ø´ را Ù ÛâگذراÙÛØ¯ â Ø§Û٠بخش Ù ÛâØªÙØ§ÙÛØ¯ از ÙÙÙ Ø¨ÛØ§ÙØ¯Ø§Ø²ÛØ¯.
اÛ٠بخش دربار٠Ù
کاÙÛØ²Ù
داخÙÛ Ø§Ø±Ø«âØ¨Ø±Û Ù super است.
Ø¨ÛØ§ÛÛØ¯ در ÚÚ¯ÙÙÚ¯Û ÙØÙ٠کار کرد٠super Ú©Ù
Û Ø¹Ù
ÛÙâØªØ± Ø´ÙÛÙ
. Ù
ا ÚÛØ²ÙØ§Û Ø¬Ø§ÙØ¨Û را Ø·Û Ù
Ø³ÛØ± Ø®ÙØ§ÙÛÙ
Ø¯ÛØ¯.
اÙÙ Ø¨Ø§ÛØ¯ بگÙÛÛÙ
Ø Ø¨Ø§ ØªÙØ¬Ù ب٠تÙ
اÙ
ÚÛØ²ÙاÛÛ Ú©Ù ØªØ§ ØØ§Ùا ÛØ§Ø¯ Ú¯Ø±ÙØªÛÙ
Ø ØºÛØ± Ù
Ù
ک٠است Ú©Ù super Ø§ØµÙØ§ کار Ú©ÙØ¯!
بÙÙØ Ø¬ÙØ¯Ø§Ø Ø¨ÛØ§ÛÛØ¯ از Ø®ÙØ¯Ù
ا٠بپرسÛÙ
Ø Ø§Ø² ÙØØ§Ø¸ ÙÙÛ ÚÚ¯ÙÙÙ Ø¨Ø§ÛØ¯ کار Ú©ÙØ¯Ø زÙ
اÙÛ Ú©Ù ÛÚ© Ù
تد Ø´ÛØ¡ اجرا Ù
ÛâØ´ÙØ¯Ø Ø´ÛØ¡ Ú©ÙÙÙÛ Ø±Ø§ ب٠عÙÙØ§Ù this Ø¯Ø±ÛØ§Ùت Ù
ÛâÚ©ÙØ¯. اگر Ù
ا super.method() را ÙØ±Ø§Ø®ÙاÙÛ Ú©ÙÛÙ
Ø Ù
ÙØªÙر Ø¨Ø§ÛØ¯ method را از Ù¾Ø±ÙØªÙتاÛÙ¾ Ø´ÛØ¡ Ú©ÙÙÙÛ Ø¯Ø±ÛØ§Ùت Ú©ÙØ¯. اÙ
ا ÚÚ¯ÙÙÙØ
اÛ٠کار Ù
Ù
ک٠است Ø³Ø§Ø¯Ù Ø¨Ù ÙØ¸Ø± Ø¨Ø±Ø³Ø¯Ø Ø§Ù
ا ÙÛØ³Øª. Ù
ÙØªÙØ±Ø Ø´ÛØ¡ Ú©ÙÙÙÛ this را Ù
ÛâØ´ÙØ§Ø³Ø¯Ø پس method ÙØ§Ùد را Ù
ÛâØªÙØ§Ùست Ø¨Ù ØµÙØ±Øª this.__proto__.method Ø¯Ø±ÛØ§Ùت Ú©ÙØ¯. Ù
ØªØ§Ø³ÙØ§ÙÙØ ÚÙÛ٠راÙâØÙ سادÙâØ§Û Ú©Ø§Ø± ÙÙ
ÛâÚ©ÙØ¯.
Ø¨ÛØ§ÛÛØ¯ ٠شک٠را ÙØ´Ø§Ù دÙÛÙ . Ø¨Ù Ù ÙØ¸Ùر Ø³Ø§Ø¯Ù Ø¨ÙØ¯ÙØ Ø§Ø² Ú©ÙØ§Ø³âÙØ§ Ø§Ø³ØªÙØ§Ø¯Ù ÙÙ ÛâÚ©ÙÛ٠٠از طرÛÙ Ø´ÛØ¡ÙØ§Û Ø³Ø§Ø¯Ù Ø§Û٠کار را Ø§ÙØ¬Ø§Ù Ù ÛâØ¯ÙÛÙ â¦
اگر ÙÙ
ÛâØ®ÙØ§ÙÛØ¯ Ø¬Ø²Ø¦ÛØ§Øª را بداÙÛØ¯ Ù
ÛâØªÙØ§ÙÛØ¯ از اÛ٠بخش Ø¨Ú¯Ø°Ø±ÛØ¯ Ù Ø¨Ù Ø²ÛØ±Ø¨Ø®Ø´ [[HomeObject]] برÙÛØ¯. اÛ٠کار Ø¶Ø±Ø±Û ÙÙ
ÛâØ±Ø³Ø§ÙØ¯. ÛØ§ اگر Ø¨Ù Ø¯Ø§ÙØ³ØªÙ عÙ
Û٠آÙâÙØ§ Ø¹ÙØ§ÙÙ Ø¯Ø§Ø±ÛØ¯ Ø¨Ù Ø®ÙØ§Ùد٠اداÙ
٠دÙÛØ¯.
در Ù
ثا٠پاÛÛÙØ rabbit.__proto__ = animal Ø¨Ø±ÙØ±Ø§Ø± است. ØØ§Ùا Ø¨ÛØ§ÛÛØ¯ اÛ٠را اÙ
ØªØØ§Ù Ú©ÙÛÙ
: در rabbit.eat() Ù
ا با Ø§Ø³ØªÙØ§Ø¯Ù از this.__proto__ Ù
تد animal.eat() را ÙØ±Ø§Ø®ÙاÙÛ Ø®ÙØ§ÙÛÙ
کرد:
let animal = {
name: "جاÙÙØ±",
eat() {
alert(`${this.name} غذا Ù
ÛâØ®ÙØ±Ø¯.`);
}
};
let rabbit = {
__proto__: animal,
name: "Ø®Ø±Ú¯ÙØ´",
eat() {
// اÛÙÚ¯ÙÙ٠کار Ú©ÙØ¯ super.eat() Ø§ØØªÙ
Ø§ÙØ§
this.__proto__.eat.call(this); // (*)
}
};
rabbit.eat(); // .Ø®Ø±Ú¯ÙØ´ غذا Ù
ÛâØ®ÙØ±Ø¯
در خط (*) Ù
ا eat را از Ù¾Ø±ÙØªÙتاÛÙ¾ (animal) Ø¯Ø±ÛØ§Ùت Ù
ÛâÚ©ÙÛÙ
٠آ٠را در زÙ
ÛÙÙâÛ Ø´ÛØ¡ Ú©ÙÙÙÛ ÙØ±Ø§Ø®ÙاÙÛ Ù
ÛâÚ©ÙÛÙ
. ÙØ·Ùا در ÙØ¸Ø± Ø¯Ø§Ø´ØªÙ Ø¨Ø§Ø´ÛØ¯ Ú©Ù .call(this) اÛÙØ¬Ø§ Ù
ÙÙ
Ø§Ø³ØªØ ÚÙÙ ÛÚ© this.__proto__.eat() ساد٠Ù
تد eat ÙØ§Ùد را در زÙ
ÛÙÙâÛ Ù¾Ø±ÙØªÙتاÛÙ¾ اجرا Ù
ÛâÚ©ÙØ¯ ÙÙ Ø´ÛØ¡ Ú©ÙÙÙÛ.
٠در کد Ø¨Ø§ÙØ§ اÛÙ Ù
تد ÙÙ
Ø§ÙØ·Ùر Ú©Ù Ù
ÛâØ®ÙØ§ÙÛÙ
کار Ù
ÛâÚ©ÙØ¯: Ù
ا alert Ø¯Ø±Ø³ØªÛ Ø±Ø§ دارÛÙ
.
ØØ§Ùا Ø¨ÛØ§ÛÛØ¯ ÛÚ© Ø´ÛØ¡ دÛگر را Ø¨Ù Ø²ÙØ¬Ûر٠اضاÙÙ Ú©ÙÛÙ . Ù ÛâØ¨ÛÙÛÙ Ú©Ù ÚÚ¯ÙÙÙ ÙÙ Ù ÚÛØ² بÙÙ Ù ÛâØ±ÛØ²Ø¯:
let animal = {
name: "جاÙÙØ±",
eat() {
alert(`${this.name} غذا Ù
ÛâØ®ÙØ±Ø¯.`);
}
};
let rabbit = {
__proto__: animal,
eat() {
// را ÙØ±Ø§Ø®ÙاÙÛ Ú©Ù (animal) Ù
اÙÙØ¯ Ø®Ø±Ú¯ÙØ´ بپر بپر Ú©Ù Ù Ù
تد ÙØ§Ùد...
this.__proto__.eat.call(this); // (*)
}
};
let longEar = {
__proto__: rabbit,
eat() {
// را ÙØ±Ø§Ø®ÙاÙÛ Ú©Ù (rabbit) Ú©Ø§Ø±Û Ú©Ù Ù Ù
تد ÙØ§Ùد (long ear) با Ú¯ÙØ´ Ø¯Ø±Ø§Ø²ÙØ§
this.__proto__.eat.call(this); // (**)
}
};
longEar.eat(); // Error: Maximum call stack size exceeded
اÛ٠کد دÛگر کار ÙÙ
ÛâÚ©ÙØ¯. Ù
ا Ù
ÛâØªÙØ§ÙÛÙ
ببÛÙÛÙ
Ú©Ù Ø§Ø±ÙØ± Ø³Ø¹Û Ø¯Ø§Ø±Ø¯ longEar.eat() را ÙØ±Ø§Ø®ÙاÙÛ Ú©ÙØ¯.
Ù
Ù
ک٠است Ø¢ÙÙØ¯Ø± ÙØ§Ø¶Ø ÙØ¨Ø§Ø´Ø¯ اÙ
ا اگر Ù
ا ÙØ±Ø§Ø®ÙاÙÛ longEar.eat() را Ø¯ÙØ¨Ø§Ù Ú©ÙÛÙ
Ø Ø³Ù¾Ø³ دÙÛ٠آ٠را Ù
ÛâØ¨ÛÙÛÙ
. در ÙØ± د٠خط (*) Ù (**) Ù
ÙØ¯Ø§Ø± this برابر با Ø´ÛØ¡ Ú©ÙÙÙÛ (longEar) است. اÛÙ ÛÚ© Ù
ÙØ¶Ùع Ø§Ø³Ø§Ø³Û Ø§Ø³Øª: تÙ
اÙ
Ù
ØªØ¯ÙØ§Û Ø´ÛØ¡Ø Ø´ÛØ¡ Ú©ÙÙÙÛ Ø±Ø§ ب٠عÙÙØ§Ù this Ø¯Ø±ÛØ§Ùت Ù
ÛâÚ©ÙÙØ¯ ÙÙ Ù¾Ø±ÙØªÙتاÛÙ¾ ÛØ§ ÚÛØ² دÛÚ¯Ø±Û Ø±Ø§.
پس در ÙØ± د٠خط (*) Ù (**) Ù
ÙØ¯Ø§Ø± this.__proto__ Ûکسا٠است: rabbit. Ø¢ÙâÙØ§ ÙØ± د٠بدÙ٠اÛÙک٠در ØÙÙ٠بÛâÙÙØ§Ûت Ø²ÙØ¬Ûر٠را Ø¨Ø§ÙØ§ برÙÙØ¯Ø rabbit.eat را ÙØ±Ø§Ø®ÙاÙÛ Ù
ÛâÚ©ÙÙØ¯.
اÛÙØ¬Ø§ تصÙÛØ±Û از اÛÙÚ©Ù ÚÙ Ø§ØªÙØ§ÙÛ Ø§ÙØªØ§Ø¯Ù Ù ÙØ¬Ùد است:
-
درÙÙ
longEar.eat()Ø Ø®Ø·(**)٠تدrabbit.eatرا با Ø¨Ø±ÙØ±Ø§Ø± کردÙthis=longEarÙØ±Ø§Ø®ÙاÙÛ Ù ÛâÚ©ÙØ¯.// this = longEar دارÛÙ longEar.eat() درÙÙ this.__proto__.eat.call(this) // (**) // ک٠تبدÛÙ Ù ÛâØ´ÙØ¯ ب٠longEar.__proto__.eat.call(this) // Ú©Ù ÛØ¹ÙÛ rabbit.eat.call(this); -
سپس در خط
(*)ازrabbit.eatØ Ù Ø§ Ù ÛâØ®ÙØ§ÙÛ٠ک٠درÙÙ Ø²ÙØ¬ÛØ±ÙØ ÙØ±Ø§Ø®ÙاÙÛ Ø±Ø§ ØØªÛ Ø¨Ø§ÙØ§ØªØ± Ø¨ÙØ±Ø³ØªÛ٠ا٠اthis=longEarØ Ù¾Ø³this.__proto__.eatØ¯ÙØ¨Ø§Ø±Ù برابرrabbit.eatاست!// this = longEar Ù٠دارÛÙ rabbit.eat() درÙÙ this.__proto__.eat.call(this) // (*) // ک٠تبدÛÙ Ù ÛâØ´ÙØ¯ ب٠longEar.__proto__.eat.call(this) // ÛØ§ (Ø¯ÙØ¨Ø§Ø±Ù) rabbit.eat.call(this); -
â¦Ù¾Ø³
rabbit.eatØ®ÙØ¯Ø´ را درÙÙ ØÙÙÙâØ§Û Ø¨ÛâÙÙØ§Ûت ÙØ±Ø§Ø®ÙاÙÛ Ù ÛâÚ©ÙØ¯ ÚÙÙ ÙÙ ÛâØªÙØ§Ùد Ø¨Ø§ÙØ§ØªØ± Ø¨Ø±ÙØ¯.
اÛÙ Ù
Ø´Ú©Ù ÙÙØ· با Ø§Ø³ØªÙØ§Ø¯Ù کرد٠از this برطر٠ÙÙ
ÛâØ´ÙØ¯.
ÙÛÚÚ¯Û [[HomeObject]]
Ø¨Ø±Ø§Û ÙØ±Ø§ÙÙ
Ø¢ÙØ±Ø¯Ù راÙâØÙØ Ø¬Ø§ÙØ§Ø§Ø³Ú©Ø±Ûپت ÛÚ© ÙÛÚÚ¯Û Ø¯Ø±ÙÙÛ Ø®Ø§Øµ دÛگر را ÙÙ
Ø¨Ø±Ø§Û ØªØ§Ø¨Ø¹âÙØ§ اضاÙÙ Ù
ÛâÚ©ÙØ¯: [[HomeObject]].
زÙ
اÙÛ Ú©Ù ØªØ§Ø¨Ø¹Û Ø¨Ù Ø¹ÙÙØ§Ù ÛÚ© Ú©ÙØ§Ø³ ÛØ§ Ù
تد Ø´ÛØ¡ Ù
شخص Ø´ÙØ¯Ø ÙÛÚÚ¯Û [[HomeObject]] برابر با Ø¢Ù Ø´ÛØ¡ ÙØ±Ø§Ø± داد٠Ù
ÛâØ´ÙØ¯.
سپس super از Ø¢Ù Ø¨Ø±Ø§Û Ø±ÙØ¹âÚ©Ø±Ø¯Ù Ù¾Ø±ÙØªÙتاÛÙ¾ ÙØ§Ùد Ù Ù
ØªØ¯ÙØ§Û Ø¢Ù Ø§Ø³ØªÙØ§Ø¯Ù Ù
ÛâÚ©ÙØ¯.
Ø¨ÛØ§ÛÛØ¯ ببÛÙÛÙ ÚÚ¯ÙÙ٠کار Ù ÛâÚ©ÙØ¯Ø ابتدا با Ø§Ø³ØªÙØ§Ø¯Ù از Ø´ÛØ¡ÙØ§Û Ø³Ø§Ø¯Ù:
let animal = {
name: "جاÙÙØ±",
eat() { // animal.eat.[[HomeObject]] == animal
alert(`${this.name} غذا Ù
ÛâØ®ÙØ±Ø¯.`);
}
};
let rabbit = {
__proto__: animal,
name: "Ø®Ø±Ú¯ÙØ´",
eat() { // rabbit.eat.[[HomeObject]] == rabbit
super.eat();
}
};
let longEar = {
__proto__: rabbit,
name: "Ú¯ÙØ´ دراز",
eat() { // longEar.eat.[[HomeObject]] == longEar
super.eat();
}
};
// Ø¨Ù Ø¯Ø±Ø³ØªÛ Ú©Ø§Ø± Ù
ÛâÚ©ÙØ¯
longEar.eat(); // Ú¯ÙØ´ دراز غذا Ù
ÛâØ®ÙØ±Ø¯
ب٠دÙÛÙ Ù
کاÙÛØ²Ù
âÙØ§Û [[HomeObject]] ÙÙ
Ø§ÙØ·Ùر Ú©Ù Ø§ÙØªØ¸Ø§Ø± Ù
ÛâØ±ÙØ¯ کار Ù
ÛâÚ©ÙØ¯. ÛÚ© Ù
ØªØ¯Ø Ù
ث٠longEar.eatØ ÙÛÚÚ¯Û [[HomeObject]] Ø®ÙØ¯Ø´ را Ù
ÛâØ´ÙØ§Ø³Ø¯ Ù Ù
تد ÙØ§Ùد را از Ù¾Ø±ÙØªÙتاÛÙ¾ Ø¢Ù Ø¯Ø±ÛØ§Ùت Ù
ÛâÚ©ÙØ¯.
Ù ØªØ¯ÙØ§ «آزاد» ÙÛØ³ØªÙد
ÙÙ
Ø§ÙØ·Ùر Ú©Ù ÙØ¨Ùا ÙÙ
Ø¯ÛØ¯ÛÙ
Ø Ø¨Ù Ø·ÙØ± Ú©ÙÛ ØªØ§Ø¨Ø¹âÙØ§ «آزاد» ÙØ³ØªÙد ٠درÙÙ Ø¬Ø§ÙØ§Ø§Ø³Ú©Ø±Ûپت Ø¨Ù Ø´ÛØ¡Ùا Ù¾ÛÙÙØ¯ زد٠شد٠ÙÛØ³ØªÙد. پس Ù
ÛâØªÙØ§ÙÙØ¯ بÛÙ Ø´ÛØ¡ÙØ§Û Ù
ختÙÙ Ú©Ù¾Û Ù ÙÙ
را٠با this دÛÚ¯Ø±Û ÙØ±Ø§Ø®ÙاÙÛ Ø´ÙÙØ¯.
ÙØ¬Ùد [[HomeObject]] اÛÙ ÙØ§Ø¹Ø¯Ù را ÙÙØ¶ Ù
ÛâÚ©ÙØ¯ ÚÙÙ Ù
ØªØ¯ÙØ§Û Ø´ÛØ¡ÙØ§Û Ø®ÙØ¯ را Ø¨Ù ÛØ§Ø¯ Ø¯Ø§Ø±ÙØ¯. [[HomeObject]] ÙÙ
ÛâØªÙØ§Ùد تغÛÛØ± Ú©ÙØ¯ پس اÛÙ Ù¾ÛÙÙØ¯ Ø§Ø¨Ø¯Û Ø§Ø³Øª.
تÙÙØ§ جاÛÛ Ø¯Ø± زبا٠ک٠[[HomeObject]] Ø§Ø³ØªÙØ§Ø¯Ù Ù
ÛâØ´ÙØ¯ super است. پس اگر Ù
ØªØ¯Û Ø§Ø² super Ø§Ø³ØªÙØ§Ø¯Ù ÙÙ
ÛâÚ©ÙØ¯Ø ÙÙÙØ² ÙÙ
Ù
ÛâØªÙØ§ÙÛÙ
آ٠را آزاد ÙØ±Ø¶ Ú©ÙÛÙ
٠بÛÙ Ø´ÛØ¡Ùا Ú©Ù¾Û Ú©ÙÛÙ
. اÙ
ا ÙÙ
را٠با super Ù
Ù
ک٠است Ù
Ø´Ú©ÙØ§ØªÛ Ù¾ÛØ´ Ø¨ÛØ§Ûد.
اÛÙ ÛÚ© دÙ
٠از ÙØªÛج٠اشتبا٠super بعد از Ú©Ù¾Û Ú©Ø±Ø¯Ù Ø¯Ø§Ø±ÛÙ
:
let animal = {
sayHi() {
alert(`Ù
Ù ÛÚ© جاÙÙØ± ÙØ³ØªÙ
`);
}
};
// Ø§Ø±Ø«âØ¨Ø±Û Ù
ÛâÚ©ÙØ¯ animal از rabbit
let rabbit = {
__proto__: animal,
sayHi() {
super.sayHi();
}
};
let plant = {
sayHi() {
alert("Ù
Ù ÛÚ© Ú¯ÛØ§Ù ÙØ³ØªÙ
");
}
};
// Ø§Ø±Ø«âØ¨Ø±Û Ù
ÛâÚ©ÙØ¯ plant از tree
let tree = {
__proto__: plant,
sayHi: rabbit.sayHi // (*)
};
tree.sayHi(); // Ù
Ù ÛÚ© جاÙÙØ± ÙØ³ØªÙ
(Ø!Ø)
ÙØ±Ø§Ø®ÙاÙÛ tree.sayHi() Ù¾ÛØ§Ù
«Ù
Ù ÛÚ© جاÙÙØ± ÙØ³ØªÙ
» را ÙØ´Ø§Ù Ù
ÛâØ¯ÙØ¯. ÙØ·Ø¹Ø§ اشتبا٠است.
دÙÛ٠آ٠ساد٠است:
- در خط
(*)Ø Ù ØªØ¯tree.sayHiازrabbitÚ©Ù¾Û Ø´Ø¯. Ø´Ø§ÛØ¯ ٠ا ÙÙØ· Ù ÛâØ®ÙØ§ÙÛ٠از تکرار کد جÙÙÚ¯ÛØ±Û Ú©ÙÛÙ Ø - ÙÛÚÚ¯Û
[[HomeObject]]Ø¢ÙrabbitØ§Ø³ØªØ ÚÙ٠درÙÙrabbitساخت٠شد. راÙÛ Ø¨Ø±Ø§Û ØªØºÛÛØ±[[HomeObject]]ÙØ¬Ùد ÙØ¯Ø§Ø±Ø¯. - کد
tree.sayHi()درÙÙ Ø®ÙØ¯Ø´super.sayHi()را دارد. اÛ٠٠تد ازrabbitØ¨Ø§ÙØ§ Ø±ÙØªÙ ٠٠تد را ازanimalØ¯Ø±ÛØ§Ùت Ù ÛâÚ©ÙØ¯.
اÛÙØ¬Ø§ تصÙÛØ±Û از اÛÙÚ©Ù ÚÙ Ø§ØªÙØ§ÙÛ Ù ÛâØ§ÙØªØ¯ را دارÛÙ :
Ù ØªØ¯ÙØ§Ø ÙÙ ÙÛÚÚ¯ÛâÙØ§Û تابعÛ
ÙÛÚÚ¯Û [[HomeObject]] ÙÙ
درÙÙ Ú©ÙØ§Ø³âÙØ§ Ù ÙÙ
درÙÙ Ø´ÛØ¡ÙØ§Û Ø³Ø§Ø¯Ù Ø¨Ø±Ø§Û Ù
ØªØ¯ÙØ§ تعرÛ٠شد٠است. اÙ
ا Ø¨Ø±Ø§Û Ø´ÛØ¡ÙØ§Ø Ù
ØªØ¯ÙØ§ Ø¨Ø§ÛØ¯ دÙÛÙØ§ Ø¨Ù ØµÙØ±Øª method() Ù
شخص Ø´ÙÙØ¯ ÙÙ Ø¨Ù ØµÙØ±Øª "method: function()".
٠٠ک٠است Ú©Ù ØªÙØ§Ùت Ø¨Ø±Ø§Û Ù Ø§ Ù ÙÙ ÙØ¨Ø§Ø´Ø¯ ا٠ا Ø¨Ø±Ø§Û Ø¬Ø§ÙØ§Ø§Ø³Ú©Ø±Ûپت Ù Ù٠است.
ذر Ù
ثا٠پاÛÛÙ Ø¨Ø±Ø§Û Ù
ÙØ§ÛØ³ÙØ سÛÙØªÚ©Ø³ ØºÛØ±Ù
ØªØ¯Û Ø§Ø³ØªÙØ§Ø¯Ù شد٠است. ÙÛÚÚ¯Û [[HomeObject]] ØªÙØ¸ÛÙ
ÙØ´Ø¯Ù است Ù Ø§Ø±Ø«âØ¨Ø±Û Ú©Ø§Ø± ÙÙ
ÛâÚ©ÙØ¯:
let animal = {
eat: function() { // اÛÙÚ¯ÙÙÙ Ù
ÛâÙÙÛØ³ÛÙ
eat() {...} از ÙØµØ¯ ب٠جاÛ
// ...
}
};
let rabbit = {
__proto__: animal,
eat: function() {
super.eat();
}
};
rabbit.eat(); // (ÙØ¬Ùد ÙØ¯Ø§Ø±Ø¯ [[HomeObject]] ÚÙÙ) Ø§Ø±ÙØ± Ú¯Ø±ÙØªÛÙ
super Ø¨Ø±Ø§Û ÙØ±Ø§Ø®ÙاÙÛ
Ø®ÙØ§ØµÙ
- Ø¨Ø±Ø§Û ØªØ¹Ù
ÛÙ
داد٠ÛÚ© Ú©ÙØ§Ø³:
class Child extends Parent:- Ú©Ù ÛØ¹ÙÛ
Child.prototype.__proto__برابر باParent.prototypeØ®ÙØ§Ùد Ø¨ÙØ¯Ø پس Ù ØªØ¯ÙØ§ ب٠ارث برد٠٠ÛâØ´ÙÙØ¯.
- Ú©Ù ÛØ¹ÙÛ
- زÙ
اÙÛ Ú©Ù ÛÚ© Ø³Ø§Ø²ÙØ¯Ù را بازÙÙÛØ³Û Ù
ÛâÚ©ÙÛÙ
:
- Ø¨Ø§ÛØ¯ Ø³Ø§Ø²ÙØ¯Ù ÙØ§Ùد را درÙÙ Ø³Ø§Ø²ÙØ¯Ù
Child(ÙØ±Ø²Ùد) ÙØ¨Ù از Ø§Ø³ØªÙØ§Ø¯Ù کرد٠ازthisØ¨Ù ØµÙØ±Øªsuper()ÙØ±Ø§Ø®ÙاÙÛ Ú©ÙÛÙ .
- Ø¨Ø§ÛØ¯ Ø³Ø§Ø²ÙØ¯Ù ÙØ§Ùد را درÙÙ Ø³Ø§Ø²ÙØ¯Ù
- زÙ
اÙÛ Ú©Ù Ù
تد دÛÚ¯Ø±Û Ø±Ø§ بازÙÙÛØ³Û Ù
ÛâÚ©ÙÛÙ
:
- Ù
ÛâØªÙØ§ÙÛÙ
Ø¨Ø±Ø§Û ÙØ±Ø§Ø®ÙاÙÛ Ù
تد
ParentØ Ø§Ø²super.method()درÙ٠٠تدChildØ§Ø³ØªÙØ§Ø¯Ù Ú©ÙÛÙ .
- Ù
ÛâØªÙØ§ÙÛÙ
Ø¨Ø±Ø§Û ÙØ±Ø§Ø®ÙاÙÛ Ù
تد
- ÚÛØ²ÙØ§Û Ø¯Ø±ÙÙÛ:
- Ù
ØªØ¯ÙØ§Û Ú©ÙØ§Ø³/Ø´ÛØ¡ Ø®ÙØ¯ را درÙÙ ÙÛÚÚ¯Û
[[HomeObject]]Ø¨Ù ÛØ§Ø¯ Ø¯Ø§Ø±ÙØ¯. ب٠ÙÙ ÛÙ ØµÙØ±ØªsuperÙ ØªØ¯ÙØ§Û ÙØ§Ùد را Ø±ÙØ¹ Ù ÛâÚ©ÙØ¯. - پس Ú©Ù¾Û Ú©Ø±Ø¯Ù Ù
تد ØØ§ÙÛ
superاز Ø´ÛØ¡ Ø¨Ù Ø´ÛØ¡ دÛگر کار ٠ط٠ئÙÛ ÙÛØ³Øª.
- Ù
ØªØ¯ÙØ§Û Ú©ÙØ§Ø³/Ø´ÛØ¡ Ø®ÙØ¯ را درÙÙ ÙÛÚÚ¯Û
ÙÙ ÚÙÛÙ:
- تابعâÙØ§Û Ú©Ù
اÙÛ
thisÛØ§superØ®ÙØ¯Ø´Ø§Ù را ÙØ¯Ø§Ø±Ùد پس Ø¢ÙâÙØ§ Ø¨Ù ØµÙØ±Øª Ù¾ÙÙØ§ÙÛ Ø¯Ø± ز٠ÛÙÙ (context) Ø¯ÙØ±Ø´Ø§Ù جا Ù ÛâÚ¯ÛØ±Ùد.
ÙØ¸Ø±Ø§Øª
<code>Ø§Ø³ØªÙØ§Ø¯Ù Ú©ÙÛØ¯Ø Ø¨Ø±Ø§Û ÚÙØ¯Û٠خط â کد را درÙ٠تگ<pre>ÙØ±Ø§Ø± دÙÛØ¯Ø Ø¨Ø±Ø§Û Ø¨ÛØ´ از د٠خط کد â Ø§Ø² ÛÚ© جعبÙÙ Ø´ÙÛ Ø§Ø³ØªÙØ§Ø¯Ù Ú©ÙÛØ¯. (plnkrØ jsbinØ codepenâ¦)