í´ëì¤ ììì ì¬ì©íë©´ í´ëì¤ë¥¼ ë¤ë¥¸ í´ëì¤ë¡ íì¥í ì ììµëë¤.
기존ì ì¡´ì¬íë 기ë¥ì í ëë¡ ìë¡ì´ 기ë¥ì ë§ë¤ ì ìì£ .
â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ì ê´ê³ë¥¼ 그림ì¼ë¡ ëíë´ë©´ ë¤ìê³¼ ê°ìµëë¤.
ë ë¤ë¥¸ í´ëì¤ Rabbitì ë§ë¤ì´ë³´ê² ìµëë¤.
í ë¼ë ë물ì´ë¯ë¡ Rabbitì ë물 ê´ë ¨ ë©ìëê° ë´ê¸´ Animalì íì¥í´ì ë§ë¤ì´ì¼ í©ëë¤. ì´ë ê² íë©´ í ë¼ë ëë¬¼ì´ í ì ìë âì¼ë°ì ì¸â ëìì ìíí ì ììµëë¤.
í´ëì¤ íì¥ ë¬¸ë² class Child extends Parent를 ì¬ì©í´ í´ëì¤ë¥¼ íì¥í´ ë´
ìë¤.
Animalì ììë°ë class Rabbit를 ë§ë¤ì´ ë³´ê² ìµëë¤.
class Rabbit extends Animal {
hide() {
alert(`${this.name} ì´/ê° ì¨ììµëë¤!`);
}
}
let rabbit = new Rabbit("í° í ë¼");
rabbit.run(5); // í° í ë¼ ì/ë ìë 5ë¡ ë¬ë¦½ëë¤.
rabbit.hide(); // í° í ë¼ ì´/ê° ì¨ììµëë¤!
í´ëì¤ Rabbitì ì¬ì©í´ ë§ë ê°ì²´ë rabbit.hide() ê°ì Rabbitì ì ìë ë©ìëìë ì ê·¼í ì ìê³ , rabbit.run() ê°ì Animalì ì ìë ë©ìëìë ì ê·¼í ì ììµëë¤.
í¤ìë extendsë íë¡í íì
ì 기ë°ì¼ë¡ ëìí©ëë¤. extendsë Rabbit.prototype.[[Prototype]]ì Animal.prototypeì¼ë¡ ì¤ì í©ëë¤. ê·¸ë 기 ë문ì Rabbit.prototypeìì ë©ìë를 ì°¾ì§ ëª»íë©´ Animal.prototypeìì ë©ìë를 ê°ì ¸ìµëë¤.
ìì§ì ë¤ì ì 차를 ë°ë¼ ë©ìë rabbit.runì ì¡´ì¬ë¥¼ íì¸í©ëë¤(그림ì ìëë¶í° ë³´ì¸ì).
- ê°ì²´
rabbitìrunì´ ìë íì¸í©ëë¤.runì´ ìë¤ì. rabbitì íë¡í íì ì¸Rabbit.prototypeì ë©ìëê° ìë íì¸í©ëë¤.hideë ìëë°runì ììµëë¤.extends를 íµí´ ê´ê³ê° ë§ë¤ì´ì§Rabbit.prototypeì íë¡í íì ,Animal.prototypeì ë©ìëê° ìë íì¸í©ëë¤. ëëì´ ë©ìërunì ì°¾ììµëë¤.
ë´ì¥ ê°ì²´ì íë¡í íì
ìì ìì본 ê²ì²ë¼ ìë°ì¤í¬ë¦½í¸ì ë´ì¥ ê°ì²´ë íë¡í íì
ì 기ë°ì¼ë¡ ìì ê´ê³ë¥¼ 맺ìµëë¤. Date.prototype.[[Prototype]]ì´ Object.prototypeì¸ ê²ì²ë¼ ë§ì´ì£ . Date ê°ì²´ìì ì¼ë° ê°ì²´ ë©ìë를 ì¬ì©í ì ìë ì´ì ê° ë°ë¡ ì¬ê¸°ì ììµëë¤.
extends ë¤ì ííìì´ ì¬ ìë ììµëë¤.í´ëì¤ ë¬¸ë²ì extends ë¤ì ííìì´ ìë ì²ë¦¬í´ì¤ëë¤.
ìë ììì²ë¼ extends ë¤ìì ë¶ëª¨ í´ëì¤ë¥¼ ë§ë¤ì´ì£¼ë í¨ì를 í¸ì¶í ì ìì£ .
function f(phrase) {
return class {
sayHi() { alert(phrase) }
}
}
class User extends f("Hello") {}
new User().sayHi(); // Hello
ì¬ê¸°ì class Userë f("Hello")ì ë°í ê°ì ììë°ìµëë¤.
ì´ ë°©ë²ì ì¡°ê±´ì ë°ë¼ ë¤ë¥¸ í´ëì¤ë¥¼ ììë°ê³ ì¶ì ë ì ì©í©ëë¤. ì¡°ê±´ì ë°ë¼ ë¤ë¥¸ í´ëì¤ë¥¼ ë°ííë í¨ì를 ë§ë¤ê³ , í¨ì í¸ì¶ 결과를 ììë°ê² íë©´ ë©ëë¤.
ë©ìë ì¤ë²ë¼ì´ë©
ì´ì íë° ë ëìê° ë©ìë를 ì¤ë²ë¼ì´ë© í´ë´
ìë¤. í¹ë³í ì¬íì´ ìì¼ë©´ class Rabbitì class Animalì ìë ë©ìë를 âê·¸ëë¡â ììë°ìµëë¤.
ê·¸ë°ë° Rabbitìì stop() ë±ì ë©ìë를 ìì²´ì ì¼ë¡ ì ìíë©´, ììë°ì ë©ìëê° ìë ìì²´ ë©ìëê° ì¬ì©ë©ëë¤.
class Rabbit extends Animal {
stop() {
// rabbit.stop()ì í¸ì¶í ë
// Animalì stop()ì´ ìë, ì´ ë©ìëê° ì¬ì©ë©ëë¤.
}
}
ê°ë°ì íë¤ ë³´ë©´ ë¶ëª¨ ë©ìë ì 체를 êµì²´íì§ ìê³ , ë¶ëª¨ ë©ìë를 í ëë¡ ì¼ë¶ 기ë¥ë§ ë³ê²½íê³ ì¶ì ëê° ìê¹ëë¤. ë¶ëª¨ ë©ìëì 기ë¥ì íì¥íê³ ì¶ì ëë ìì£ . ì´ë´ ë 커ì¤í ë©ìë를 ë§ë¤ì´ ìì íê² ëëë°, ì´ë¯¸ 커ì¤í ë©ìë를 ë§ë¤ìëë¼ë ì´ ê³¼ì ì ·íì ë¶ëª¨ ë©ìë를 í¸ì¶íê³ ì¶ì ëê° ììµëë¤.
í¤ìë superë ì´ë´ ë ì¬ì©í©ëë¤.
super.method(...)ë ë¶ëª¨ í´ëì¤ì ì ìë ë©ìë,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(); // ì¨ìµëë¤.
}
}
let rabbit = new Rabbit("í° í ë¼");
rabbit.run(5); // í° í ë¼ê° ìë 5ë¡ ë¬ë¦½ëë¤.
rabbit.stop(); // í° í ë¼ê° ë©ì·ìµëë¤. í° í ë¼ê° ì¨ììµëë¤!
Rabbitì ì´ì ì¤í ì¤ê°ì ë¶ëª¨ í´ëì¤ì ì ìë ë©ìë super.stop()ì í¸ì¶íë stopì ê°ì§ê² ëìë¤ì.
superê° ììµëë¤.íì´í í¨ì ë¤ì ì´í´ë³´ê¸°ìì ì´í´ë³¸ ë°ì ê°ì´, íì´í í¨ìë super를 ì§ìíì§ ììµëë¤.
superì ì ê·¼íë©´ ìë ììì ê°ì´ super를 ì¸ë¶ í¨ììì ê°ì ¸ìµëë¤.
class Rabbit extends Animal {
stop() {
setTimeout(() => super.stop(), 1000); // 1ì´ íì ë¶ëª¨ stopì í¸ì¶í©ëë¤.
}
}
íì´í í¨ìì superë stop()ì superì ê°ìì ì ììë ìëí ëë¡ ëìí©ëë¤. ê·¸ë ì§ë§ setTimeoutììì âì¼ë°â í¨ì를 ì¬ì©íë¤ë©´ ìë¬ê° ë°ìíì ê²ëë¤.
// Unexpected super
setTimeout(function() { super.stop() }, 1000);
ìì±ì ì¤ë²ë¼ì´ë©
ìì±ì ì¤ë²ë¼ì´ë©ì ì¢ ë ê¹ë¤ë¡ìµëë¤.
ì§ê¸ê¹ì§ Rabbitì ìì²´ constructorê° ìììµëë¤.
ëª
ì¸ìì ë°ë¥´ë©´, í´ëì¤ê° ë¤ë¥¸ í´ëì¤ë¥¼ ììë°ê³ constructorê° ìë ê²½ì°ì ìëì²ë¼ âë¹ì´ìëâ constructorê° ë§ë¤ì´ì§ëë¤.
class Rabbit extends Animal {
// ìì²´ ìì±ìê° ìë í´ëì¤ë¥¼ ììë°ì¼ë©´ ìëì¼ë¡ ë§ë¤ì´ì§
constructor(...args) {
super(...args);
}
}
ë³´ìë¤ìí¼ ìì±ìë 기본ì ì¼ë¡ ë¶ëª¨ constructor를 í¸ì¶í©ëë¤. ì´ë ë¶ëª¨ 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); // ReferenceError: Must call super constructor in derived class before accessing 'this' or returning from derived constructor
ìì´ì½! ìë¬ê° ë°ìíë¤ì. í ë¼ë¥¼ ë§ë¤ ì ììµëë¤. 무ìì´ ì못ë 걸ê¹ì?
ì´ì ë ë¤ìê³¼ ê°ìµëë¤.
- ìì í´ëì¤ì ìì±ììì ë°ëì
super(...)를 í¸ì¶í´ì¼ íëë°,super(...)를 í¸ì¶íì§ ìì ìë¬ê° ë°ìíìµëë¤.super(...)ëthis를 ì¬ì©í기 ì ì ë°ëì í¸ì¶í´ì¼ í©ëë¤.
ê·¸ë°ë° ì super(...)를 í¸ì¶í´ì¼ íë 걸ê¹ì?
ë¹ì°í ì´ì ê° ììµëë¤. ìì í´ëì¤ì ìì±ìê° í¸ì¶ë ë ì´ë¤ ì¼ì´ ì¼ì´ëëì§ ììë³´ë©° ì´ì 를 ì°¾ìë´ ìë¤.
ìë°ì¤í¬ë¦½í¸ë 'ìì í´ëì¤ì ìì±ì í¨ì(derived constructor)'ì ê·¸ë ì§ ìì ìì±ì í¨ì를 구ë¶í©ëë¤. ìì í´ëì¤ì ìì±ì í¨ìì í¹ì ë´ë¶ íë¡í¼í°ì¸ [[ConstructorKind]]:"derived"ê° ì´ë¦íì²ë¼ ë¶ìµëë¤.
ì¼ë° í´ëì¤ì ìì±ì í¨ìì ìì í´ëì¤ì ìì±ì í¨ì ê° ì°¨ì´ë newì í¨ê» ëë¬ë©ëë¤.
- ì¼ë° í´ëì¤ê°
newì í¨ê» ì¤íëë©´, ë¹ ê°ì²´ê° ë§ë¤ì´ì§ê³thisì ì´ ê°ì²´ë¥¼ í ë¹í©ëë¤. - ë°ë©´, ìì í´ëì¤ì ìì±ì í¨ìê° ì¤íëë©´, ì¼ë° í´ëì¤ìì ì¼ì´ë ì¼ì´ ì¼ì´ëì§ ììµëë¤. ìì í´ëì¤ì ìì±ì í¨ìë ë¹ ê°ì²´ë¥¼ ë§ë¤ê³
thisì ì´ ê°ì²´ë¥¼ í ë¹íë ì¼ì ë¶ëª¨ í´ëì¤ì ìì±ìê° ì²ë¦¬í´ì£¼ê¸¸ 기ëí©ëë¤.
ì´ë° ì°¨ì´ ë문ì ìì í´ëì¤ì ìì±ììì super를 í¸ì¶í´ ë¶ëª¨ ìì±ì를 ì¤íí´ ì£¼ì´ì¼ í©ëë¤. ê·¸ë ì§ ìì¼ë©´ thisê° ë ê°ì²´ê° ë§ë¤ì´ì§ì§ ìì ìë¬ê° ë°ìí©ëë¤.
ìë ììì ê°ì´ this를 ì¬ì©í기 ì ì super()를 í¸ì¶íë©´ Rabbitì ìì±ìê° ì ëë¡ ëìí©ëë¤.
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
Animalì ììë°ë Rabbitìì name íë를 ì¤ë²ë¼ì´ë© íìµëë¤.
Rabbitìë ë°ë¡ ìì±ìê° ì ìëì´ ìì§ ì기 ë문ì 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ì íëë super() ì¤í íì ì´ê¸°íë©ëë¤. ë¶ëª¨ ìì±ìê° ì¤íëë ìì ì Rabbitì íëë ìì§ ì¡´ì¬íì§ ìì£ . ì´ë° ì´ì ë¡ íë를 ì¤ë²ë¼ì´ë© íì ë Animalì ìë íëê° ì¬ì©ë ê²ì
ëë¤.
ì´ë ê² ìë°ì¤í¬ë¦½í¸ë ì¤ë²ë¼ì´ë©ì íëì ë©ìëì ëì ë°©ìì´ ë¯¸ë¬íê² ë¤ë¦ ëë¤.
ë¤ííë ì´ë° 문ì ë ì¤ë²ë¼ì´ë©í íë를 ë¶ëª¨ ìì±ììì ì¬ì©í ëë§ ë°ìí©ëë¤. ì´ë° ì°¨ì´ê° ì ë°ìíëì§ ëª¨ë¥´ë©´ 결과를 í´ìí ì ìë ìí©ì´ ë°ìí기 ë문ì ë³ëì ê³µê°ì ë§ë¤ì´ íë ì¤ë²ë¼ì´ë©ì ë´ë¶ìì ë²ì´ì§ë ì¼ì ëí´ ìì¸í ììë³´ììµëë¤.
ê°ë°íë¤ê° íë ì¤ë²ë¼ì´ë©ì´ 문ì ê° ëë ìí©ì´ ë°ìíë©´ íë ëì ë©ìë를 ì¬ì©íê±°ë getterë setter를 ì¬ì©í´ í´ê²°íë©´ ë©ëë¤.
super í¤ìëì [[HomeObject]]
íí 리ì¼ì ì²ì ì½ë ë¶ì´ë¼ë©´ ì´ë² ì ì ëì´ê°ìë ì¢ìµëë¤.
ì´ë² ì ìì ììê³¼ superì ë´ë¶ ë©ì»¤ëì¦ì ëí´ ë¤ë£° ìì ì
ëë¤.
superì ëí´ì ì¢ ë ê¹ì´ íë´
ìë¤. ì¤ê°ì¤ê° í¥ë¯¸ë¡ì´ ì ì ë°ê²¬í ì ìì ê²ëë¤.
먼ì ëë ¤ì¼ í ë§ì ì§ê¸ê¹ì§ ë°°ì´ ë´ì©ë§ì¼ë¡ superê° ì ëë¡ ëìíì§ ìëë¤ë ê²ì
ëë¤.
ë¤ ìì½ì§ë§ ê·¸ë ìµëë¤. "ë´ë¶ìì superë âì´ë»ê²â ëìí ê¹?"ë¼ë ì§ë¬¸ì ìì ìê² ëì ¸ë´
ìë¤. "ê°ì²´ ë©ìëê° ì¤íëë©´ íì¬ ê°ì²´ê° thisê° ëë¤. ì´ ìíìì super.method()를 í¸ì¶íë©´ ìì§ì íì¬ ê°ì²´ì íë¡í íì
ìì method를 ì°¾ìì¼ íë¤."ê¹ì§ ë ì¬ë¦´ ì ìì ê²ëë¤. ê·¸ë°ë° ì´ë° ê³¼ì ì âì´ë»ê²â ì¼ì´ëë 걸ê¹ì?
ì¬ì ë³´ì´ë ì§ë¬¸ ê°ì§ë§ ì¤ì ë¡ ê·¸ë ì§ ììµëë¤. ìì§ì íì¬ ê°ì²´ this를 ì기 ë문ì this.__proto__.method를 íµí´ ë¶ëª¨ ê°ì²´ì method를 ì°¾ì ì ìì ê² ê°ì£ . íì§ë§ ë¶ííê²ë ì´ë° âëì´ë¸íâ ìê°ì ë¤ì´ë§ì§ ììµëë¤.
구체ì ì¸ ì½ëì í¨ê» 문ì 를 ì¬íí´ ë³´ê² ìµëë¤. ê°ê²°ì±ì ìí´ í´ëì¤ê° ìë ì¼ë° ê°ì²´ë¥¼ ì¬ì©í´ ìì를 구ì±í´ ë´ ìë¤.
구체ì ì¸ ë´ë¶ ëìì ê´ì¬ì´ ìì¼ë©´ ì´ ë¶ë¶ì ì§ëì¹ê³ [[HomeObject]]ë¡ ë°ë¡ ëì´ê°ì
ë ì¢ìµëë¤. ì§ê¸ë¶í° ë¤ë£° ë´ì©ì ëª¨ë¥´ê³ ë [[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)ìì ê°ì ¸ì¤ê³ íì¬ ê°ì²´ì 컨í
ì¤í¸ì 기ë°íì¬ eatì í¸ì¶í©ëë¤. ì¬ê¸°ì 주ìí´ì ë´ì¼ í ë¶ë¶ì .call(this)ì
ëë¤. this.__proto__.eat()ë§ ìì¼ë©´ íì¬ ê°ì²´ê° ìë íë¡í íì
ì 컨í
ì¤í¸ìì ë¶ëª¨ eatì ì¤íí기 ë문ì .call(this)ì´ ìì´ì¼ í©ëë¤.
ìì를 ì¤ííë©´ ììí ë´ì©ì´ ì¼ë¿ì°½ì ì¶ë ¥ëë ê²ì íì¸í ì ìë¤ì.
ì ì´ì ì²´ì¸ì ê°ì²´ë¥¼ íë ë ì¶ê°í´ë³´ê² ìµëë¤. ì´ì ì¬ì¬ 문ì ê° ë°ìí기 ììí©ëë¤.
let animal = {
name: "ë물",
eat() {
alert(`${this.name} ì´/ê° ë¨¹ì´ë¥¼ 먹ìµëë¤.`);
}
};
let rabbit = {
__proto__: animal,
eat() {
// callì ì¬ì©í´ 컨í
ì¤í¸ë¥¼ ì®ê²¨ê°ë©° ë¶ëª¨(animal) ë©ìë를 í¸ì¶í©ëë¤.
this.__proto__.eat.call(this); // (*)
}
};
let longEar = {
__proto__: rabbit,
eat() {
// longEar를 ê°ì§ê³ 무ì¸ê°ë¥¼ íë©´ì ë¶ëª¨(rabbit) ë©ìë를 í¸ì¶í©ëë¤.
this.__proto__.eat.call(this); // (**)
}
};
longEar.eat(); // RangeError: Maximum call stack size exceeded
ììê³¼ ë¬ë¦¬ longEar.eat()를 í¸ì¶íë ìë¬ê° ë°ìíë¤ì!
ìì¸ì´ ìì°ì¹ ìì ë³´ì´ì§ë§ longEar.eat()ì´ í¸ì¶ë ë ì´ë¤ ì¼ì´ ë°ìíëì§ íëì© ì¶ì²íë¤ë³´ë©´ ì´ì 를 ì ì ììµëë¤. 먼ì ì´í´ë´ì¼ í ê²ì (*)ê³¼ (**)ë¡ íìí ì¤ì
ëë¤. ì´ ë ì¤ìì thisë íì¬ ê°ì²´ì¸ longEarê° ë©ëë¤. ì¬ê¸°ì íµì¬ì´ ììµëë¤. 모ë ê°ì²´ ë©ìëë íë¡í íì
ë±ì´ ìë íì¬ ê°ì²´ë¥¼ thisë¡ ê°ìµëë¤.
ë°ë¼ì (*)ê³¼ (**)ë¡ íìí ì¤ì this.__proto__ì ì íí ê°ì ê°, rabbitì´ í ë¹ë©ëë¤. ì²´ì¸ ìë¡ ì¬ë¼ê°ì§ ìê³ ì쪽 모ëìì rabbit.eatì í¸ì¶í기 ë문ì 무í 루íì ë¹ ì§ê² ëì£ .
ì´ë¥¼ 그림ì¼ë¡ ëíë´ë©´ ë¤ìê³¼ ê°ìµëë¤.
-
longEar.eat()ë´ë¶ì(**)ë¡ íìí ì¤ììrabbit.eatì í¸ì¶íëë°, ì´ëthisëlongEarì ëë¤.// longEar.eat()ìì thisë longEarì ëë¤. this.__proto__.eat.call(this) // (**) // ë°ë¼ì ìì¤ì ìëì ê°ìì§ëë¤. longEar.__proto__.eat.call(this) // longEarì íë¡í íì ì rabbitì´ë¯ë¡ ìì¤ì ìëì ê°ìì§ëë¤. rabbit.eat.call(this); -
rabbit.eatë´ë¶ì(*)ë¡ íìí ì¤ìì ì²´ì¸ ì쪽ì ìë í¸ì¶ì ì ë¬íë ¤ íì¼ëthisê°longEarì´ê¸° ë문ì ëë¤ìrabbit.eatì´ í¸ì¶ë©ëë¤.// rabbit.eat()ìì this ìì longEarì ëë¤. this.__proto__.eat.call(this) // (*) // ë°ë¼ì ìì¤ì ìëì ê°ìì§ëë¤. longEar.__proto__.eat.call(this) // longEarì íë¡í íì ì rabbitì´ë¯ë¡ ìì¤ì ìëì ê°ìì§ëë¤. rabbit.eat.call(this); -
ì´ë° ë´ë¶ ëì ë문ì
rabbit.eatì ì²´ì¸ ìë¡ ì¬ë¼ê°ì§ 못íê³ ì기 ìì ì ê³ì í¸ì¶í´ 무í 루íì ë¹ ì§ê² ë©ëë¤.
ì´ë° 문ì ë thisë§ì¼ë¡ í´ê²°í ì ììµëë¤.
[[HomeObject]]
ìë°ì¤í¬ë¦½í¸ì ì´ë° 문ì 를 í´ê²°í ì ìë í¨ì ì ì© í¹ì ë´ë¶ íë¡í¼í°ê° ììµëë¤. ë°ë¡ [[HomeObject]]ì
ëë¤.
í´ëì¤ì´ê±°ë ê°ì²´ ë©ìëì¸ í¨ìì [[HomeObject]] íë¡í¼í°ë í´ë¹ ê°ì²´ê° ì ì¥ë©ëë¤.
superë [[HomeObject]]를 ì´ì©í´ ë¶ëª¨ íë¡í íì
ê³¼ ë©ìë를 ì°¾ìµëë¤.
ìì를 íµí´ [[HomeObject]]ê° ì´ë»ê² ëìíëì§ ì´í´ë´
ìë¤. 먼ì ì¼ë° ê°ì²´ë¥¼ ì´ì©í´ ë³´ê² ìµëë¤.
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 ìì´ë íë¡í íì
ì¼ë¡ë¶í° ë¶ëª¨ ë©ìë를 ê°ì ¸ì¬ ì ììµëë¤.
ë©ìëë ìì ë¡ì§ ììµëë¤
ìë°ì¤í¬ë¦½í¸ìì í¨ìë ëê° ê°ì²´ì 묶ì´ì§ ìê³ âìì ë¡ìµëë¤â. ì´ë° ìì ì± ë문ì thisê° ë¬ë¼ë ê°ì²´ ê° ë©ìë를 ë³µì¬íë ê²ì´ ê°ë¥íì£ .
ê·¸ë°ë° [[HomeObject]]ë ê·¸ ì¡´ì¬ë§ì¼ë¡ë í¨ìì ìì ë를 íê´´í©ëë¤. ë©ìëê° ê°ì²´ë¥¼ 기ìµí기 ë문ì
ëë¤. ê°ë°ìê° [[HomeObject]]를 ë³ê²½í ë°©ë²ì ì기 ë문ì í ë² ë°ì¸ë© ë í¨ìë ë ì´ì ë³ê²½ëì§ ìì£ .
ë¤íì¸ ì ì [[HomeObject]]ë ì¤ì§ super ë´ë¶ììë§ ì í¨íë¤ë ê²ì
ëë¤. ê·¸ë 기 ë문ì ë©ìëìì super를 ì¬ì©íì§ ìë ê²½ì°ì ë©ìëì ìì ì±ì´ ë³´ì¥ë©ëë¤. ê°ì²´ ê° ë³µì¬ ìì ê°ë¥íì£ . íì§ë§ ë©ìëìì super를 ì¬ì©íë©´ ì´ì¼ê¸°ê° ë¬ë¼ì§ëë¤.
ê°ì²´ ê° ë©ìë를 ì못 ë³µì¬í ê²½ì°ì superê° ì ëë¡ ëìíì§ ìë ê²½ì°ë¥¼ ì´í´ë´
ìë¤.
let animal = {
sayHi() {
console.log(`ëë ë물ì
ëë¤.`);
}
};
// rabbitì animalì ììë°ìµëë¤.
let rabbit = {
__proto__: animal,
sayHi() {
super.sayHi();
}
};
let plant = {
sayHi() {
console.log("ëë ì물ì
ëë¤.");
}
};
// treeë plant를 ììë°ìµëë¤.
let tree = {
__proto__: plant,
sayHi: rabbit.sayHi // (*)
};
tree.sayHi(); // ëë ë물ì
ëë¤. (?!?)
tree.sayHi()를 í¸ì¶íë "ëë ë물ì
ëë¤."ê° ì¶ë ¥ë©ëë¤. ëê° ì못ë ê²ì´ ë¶ëª
í´ ë³´ì´ë¤ì.
ìì¸ì 꽤 ë¨ìí©ëë¤.
(*)ë¡ íìí ì¤ìì ë©ìëtree.sayHië ì¤ë³µ ì½ë를 ë°©ì§í기 ìí´rabbitìì ë©ìë를 ë³µì¬í´ììµëë¤.- ê·¸ë°ë° ë³µì¬í´ì¨ ë©ìëë
rabbitìì ìì±í기 ë문ì ì´ ë©ìëì[[HomeObject]]ërabbitì ëë¤, ê°ë°ìë[[HomeObject]]를 ë³ê²½í ì ììµëë¤. tree.sayHi()ì ì½ë ë´ë¶ìsuper.sayHi()ê° ììµëë¤.rabbitì íë¡í íì ìanimalì´ë¯ë¡superë ì²´ì¸ ìììëanimalë¡ ì¬ë¼ê°sayHi를 ì°¾ìµëë¤.
ì¼ë ¨ì ê³¼ì ì 그림ì¼ë¡ ëíë´ë©´ ë¤ìê³¼ ê°ìµëë¤.
í¨ì íë¡í¼í°ê° ìë ë©ìë ì¬ì©í기
[[HomeObject]]ë í´ëì¤ì ì¼ë° ê°ì²´ì ë©ìëìì ì ìë©ëë¤. ê·¸ë°ë° ê°ì²´ ë©ìëì ê²½ì° [[HomeObject]]ê° ì ëë¡ ëìíê² íë ¤ë©´ ë©ìë를 ë°ëì method() ííë¡ ì ìí´ì¼ í©ëë¤. "method: function()" ííë¡ ì ìíë©´ ì ë©ëë¤.
ê°ë°ì ì ì¥ìì ë ë°©ë²ì ì°¨ì´ë 그리 ì¤ìíì§ ìì ì ìì§ë§, ìë°ì¤í¬ë¦½í¸ ì ì¥ìì ì주 ì¤ìí©ëë¤.
ë©ìë 문ë²ì´ ìë(non-method syntax) í¨ì íë¡í¼í°ë¥¼ ì¬ì©í´ ìì를 ìì±í´ ë³´ë©´ ë¤ìê³¼ ê°ìµëë¤. [[HomeObject]] íë¡í¼í°ê° ì¤ì ëì§ ì기 ë문ì ììì´ ì ëë¡ ëìíì§ ìë ê²ì íì¸í ì ììµëë¤.
let animal = {
eat: function() { // 'eat() {...' ëì 'eat: function() {...'ì ì¬ì©í´ë´
ìë¤.
// ...
}
};
let rabbit = {
__proto__: animal,
eat: function() {
super.eat();
}
};
rabbit.eat(); // SyntaxError: 'super' keyword unexpected here ([[HomeObject]]ê° ìì´ì ìë¬ê° ë°ìí¨)
ìì½
- í´ëì¤ íì¥í기:
class Child extends ParentChild.prototype.__proto__ê°Parent.prototypeì´ ëë¯ë¡ ë©ìë ì ì²´ê° ììë©ëë¤.
- ìì±ì ì¤ë²ë¼ì´ë©:
this를 ì¬ì©í기 ì ìChildìì±ì ìììsuper()ë¡ ë¶ëª¨ ìì±ì를 ë°ëì í¸ì¶í´ì¼ í©ëë¤.
- ë©ìë ì¤ë²ë¼ì´ë©:
Childì ì ìë ë©ìëììsuper.method()를 ì¬ì©í´Parentì ì ìë ë©ìë를 ì¬ì©í ì ììµëë¤.
- super í¤ìëì [[HomeObject]]
- ë©ìëë ë´ë¶ íë¡í¼í°
[[HomeObject]]ì ìì ì´ ì ìë í´ëì¤ì ê°ì²´ë¥¼ 기ìµí´ëìµëë¤.superë[[HomeObject]]를 ì¬ì©í´ ë¶ëª¨ ë©ìë를 ì°¾ìµëë¤. - ë°ë¼ì
superê° ìë ë©ìëë ê°ì²´ ê° ë³µì¬ ì ì ëë¡ ëìíì§ ìì ì ììµëë¤.
- ë©ìëë ë´ë¶ íë¡í¼í°
ì¶ê° ì¬í:
- íì´í í¨ìë
thisësuper를 ê°ì§ ìì¼ë¯ë¡ ì£¼ë³ ì»¨í ì¤í¸ì ì ë¤ì´ë§ìµëë¤.
ëê¸
<code>í그를, ì¬ë¬ ì¤ë¡ 구ì±ë ì½ë를 ì½ì íê³ ì¶ë¤ë©´<pre>í그를 ì´ì©íì¸ì. 10ì¤ ì´ìì ì½ëë plnkr, JSBin, codepen ë±ì ìëë°ì¤ë¥¼ ì¬ì©íì¸ì.