class inheritance - Lee-hyuna/33-js-concepts-kr GitHub Wiki
ν΄λμ€ μμ
μλ¬Έ: Class inheritance
ν΄λμ€ μμμ ν ν΄λμ€κ° λ€λ₯Έ ν΄λμ€λ₯Ό νμ₯νλ λ°©λ²μ΄λ€.
λ°λΌμ κΈ°μ‘΄ κΈ°λ₯ μμ μλ‘μ΄ κΈ°λ₯μ λ§λ€ μ μλ€.
"extends"
Animal ν΄λμ€κ° μλ€κ³ κ°μ ν΄ λ³΄μ
class Animal {
constructor(name) {
this.speed = 0;
this.name = name;
}
run(speed) {
this.speed += speed;
alert(`${this.name} runs with speed ${this.speed}.`);
}
stop() {
this.speed = 0;
alert(`${this.name} stands still.`);
}
}
let animal = new Animal("My animal");
animal κ°μ²΄μ Animal ν΄λμ€λ₯Ό κ·Έλ¦ΌμΌλ‘ νννλ©΄ μλμ κ°λ€.
μ΄ Animal ν΄λμ€λ‘ Rabbit ν΄λμ€λ₯Ό λ§λ€μ΄ 보μ.
ν λΌλ λλ¬Όμ΄κΈ° λλ¬Έμ Rabbit ν΄λμ€λ Animalμ κΈ°λ°μ λλ©°, Animal ν΄λμ€μ λ©μλμ μ ν μ μλ€. λ°λΌμ ν λΌλ "μΌλ°μ μΈ" λλ¬Όμ΄ ν μ μλ μΌμ ν μ μλ€.
ν΄λμ€λ₯Ό νμ₯νλ ꡬ문μ λ€μκ³Ό κ°λ€.: class Child extends Parent.
Animalμ μμλ°μ class Rabbitμ λ§λ€μ΄ 보μ :
class Rabbit extends Animal {
hide() {
alert(`${this.name} hides!`);
}
}
let rabbit = new Rabbit("White Rabbit");
rabbit.run(5); // White Rabbit runs with speed 5.
rabbit.hide(); // White Rabbit hides!
Rabbitν΄λμ€λ‘ λ§λ κ°μ²΄λ rabbit.hide()μ κ°μ Rabbit λ©μλμ rabbit.run()μ κ°μ Animal λ©μλ λλ€ μ κ·Όμ΄ κ°λ₯νλ€.
λ΄λΆμ μΌλ‘ extends ν€μλλ κΈ°μ‘΄ νλ‘ν νμ
κΈ°λ²μ μ¬μ©νμ¬ λμνλ€. extends λ Rabbit.prototype.[Prototype](/Lee-hyuna/33-js-concepts-kr/wiki/Prototype)λ₯Ό Animal.prototypeλ‘ μ€μ νλ€. λ°λΌμ Rabbit.prototypeμ μ°Ύλ λ©μλκ° μμΌλ©΄ JavaScriptλ Animal.prototypeμμ λ©μλλ₯Ό μ°Ύλλ€.
μλ₯Ό λ€μ΄, rabbit.run λ©μλλ₯Ό μ°ΎκΈ° μν΄ μμ§μ λ΄λΆμ μΌλ‘ μλμ κ°μ΄ λμνλ€.
rabbitκ°μ²΄(runμ΄ μλ) νμΈ.- νλ‘ν νμ
μΈ
Rabbit.prototype(hideλ μμ§λ§runμ΄ μλ) νμΈ - νλ‘ν νμ
μΈ
Animal.prototype(extendsμΌλ‘ μΈν΄) νμΈ. λ§μΉ¨λ΄runλ©μλλ₯Ό μ°Ύλλ€ .
Native prototypes μ₯μμ κΈ°μ΅ν μ μλ―μ΄, JavaScript μ체λ λ΄μ₯ κ°μ²΄μ νλ‘ν νμ
μμμ μ¬μ©ν©λλ€. μλ₯Ό λ€λ©΄ Date.prototype.[Prototype](/Lee-hyuna/33-js-concepts-kr/wiki/Prototype)λ Object.prototypeμ΄λ€. κ·Έλ κΈ° λλ¬Έμ λ μ§κ° μΌλ° κ°μ²΄ λ©μλμ μ κ·Όν μ μλ€.
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μμ "μλ κ·Έλλ‘" κ°μ Έμ¨λ€.
κ·Έλ¬λ μλ μμ μμ 보λ―μ΄ stop()μ κ°μ΄ Rabbit λ΄λΆμ μ체 λ©μλλ₯Ό μ§μ νλ©΄ λμ μ¬μ©λλ€.
class Rabbit extends Animal {
stop() {
// ...now this will be used for rabbit.stop()
// instead of stop() from class Animal
}
}
μΌλ°μ μΌλ‘ μ€λ²λΌμ΄λ©μ λΆλͺ¨ λ©μλλ₯Ό μμ ν λ체νλ€λ κ² λ³΄λ¨, κ·Έ μμ κΈ°λ₯μ μ‘°μ λλ νμ₯ν λ μ¬μ©νλ€. μ°λ¦¬μ λ©μλμμ λκ°λ₯Ό νμ§λ§, κ·Έ μ νλ κ·Έ κ³Όμ μμ λΆλͺ¨ λ©μλλ₯Ό λΆλ₯Έλ€.
ν΄λμ€λ μ΄λ₯Όμν "super" ν€μλλ₯Ό μ 곡νλ€.
super.method(...)λ λΆλͺ¨ λ©μλλ₯Ό νΈμΆνλ€.super(...)λ λΆλͺ¨ μμ±μλ₯Ό νΈμΆνλ€. (μμ±μ λ΄λΆμμλ§)
μλ₯Ό λ€μ΄, ν λΌκ° λ©μΆμμ λ μλ μ¨κΈ°κΈ°λ₯Ό μ€μ ν΄λ³΄μ.
class Animal {
constructor(name) {
this.speed = 0;
this.name = name;
}
run(speed) {
this.speed += speed;
alert(`${this.name} runs with speed ${this.speed}.`);
}
stop() {
this.speed = 0;
alert(`${this.name} stands still.`);
}
}
class Rabbit extends Animal {
hide() {
alert(`${this.name} hides!`);
}
stop() {
super.stop(); // call parent stop
this.hide(); // and then hide
}
}
let rabbit = new Rabbit("White Rabbit");
rabbit.run(5); // White Rabbit runs with speed 5.
rabbit.stop(); // White Rabbit stands still. White rabbit hides!
μ΄μ Rabbitμ λΆλͺ¨μ λ©μλλ₯Ό νΈμΆνλ super.stop()μ κ°μ§ stopλ©μλκ° μλ€.
νμ΄ν ν¨μλ
superκ° μ‘΄μ¬νμ§ μλλ€.νμ΄ν ν¨μ μ₯μμ μΈκΈνλ―μ΄ νμ΄ν ν¨μμλ
superκ° μλ€.
superμ μ κ·Όνλ €νλ©΄ μΈλΆ ν¨μμμ κ°μ Έμ¨λ€. μλ₯Ό λ€μ΄ :class Rabbit extends Animal { stop() { setTimeout(() => super.stop(), 1000); // call parent stop after 1sec } }νμ΄ν ν¨μμ
superλstop()ν¨μμμsuperμ λμΌνλ€. κ·Έλμ μλλλ‘ μλνλ€. μ¬κΈ°μ μΌλ°μ μΈ ν¨μλ₯Ό μ§μ νλ©΄ μ€λ₯κ° λ°μνλ€.// Unexpected super setTimeout(function() { super.stop() }, 1000);
μμ±μ μ€λ²λΌμ΄λ©(μ¬μ μ)
μμ±μλ₯Ό μ€λ²λΌμ΄λ©νλ κ²μ μ½κ° κΉλ€λ‘λ€.
μ§κΈκΉμ§λ Rabbitμ constructorκ° μμλ€.
μ€ν μ λ°λ₯΄λ©΄ , ν΄λμ€κ° λ€λ₯Έ ν΄λμ€λ₯Ό νμ₯νκ³ constructorμλ κ²½μ° λ€μκ³Ό κ°μ "λΉ" constructorμ΄ μμ±λλ€.
class Rabbit extends Animal {
// generated for extending classes without own constructors
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;
}
// ...
}
// Doesn't work!
let rabbit = new Rabbit("White Rabbit", 10); // Error: this is not defined.
μΌμ ! μ€λ₯κ° λ°μνλ€. ν λΌλ₯Ό λ§λλλ° μ€ν¨νλ€. 무μμ΄ μλͺ» λμκΉ?
λ΅μ μμ ν΄λμ€μ μμ±μκ° thisλ₯Ό μ¬μ©νκΈ°μ μ .super(...) νΈμΆν΄μΌλ§ νλ€λ κ²μ΄λ€.
κ·Έλ¬λ μ κ·ΈλμΌλ§ν κΉ?
μμΈν μ§ν μν©μ 보면 μ΄ν΄κ° κ°λ₯νλ€.
JavaScriptμλ μμ ν΄λμ€μ μμ±μ ν¨μλ§μ νΉμ§μ΄ μλ€. μμ ν΄λμ€μ μμ±μ ν¨μλ νΉμν λ΄λΆ μμ±μΌλ‘ λ μ΄λΈμ΄ μ§μ λλ€. [ConstructorKind](/Lee-hyuna/33-js-concepts-kr/wiki/ConstructorKind):"derived".
μ°¨μ΄μ μ λ€μκ³Ό κ°λ€.
- μΌλ° μμ±μκ° μ€νλ λ, λΉ κ°μ²΄λ₯Ό λ§λ€μ΄
thisμ ν λΉνλ€. - κ·Έλ¬λ μμ ν΄λμ€μ μμ±μκ° μ€νλ λλ, μ΄ μμ μ μννμ§ μλλ€. λΆλͺ¨ μμ±μκ° μ΄ μμ μ μν ν κ²μΌλ‘ κΈ°λνλ€.
λ°λΌμ μμ ν΄λμ€μ μμ±μλ₯Ό λ§λ€μλ€λ©΄ superλ₯Ό νΈμΆν΄μΌνλ€. κ·Έλ μ§ μμΌλ©΄ this λν κ°μ²΄κ° μμ±λμ§ μλλ€. κ·Έλ¦¬κ³ μλ¬κ° λ°μνλ€.
μλ₯Ό λ€μ΄ Rabbit μμ±μκ° λμνλ €λ©΄ μλμ²λΌ thisλ₯Ό μ¬μ©νκΈ° μ μ, super()λ₯Ό νΈμΆν΄νλ€.
lass Animal {
constructor(name) {
this.speed = 0;
this.name = name;
}
// ...
}
class Rabbit extends Animal {
constructor(name, earLength) {
super(name);
this.earLength = earLength;
}
// ...
}
// now fine
let rabbit = new Rabbit("White Rabbit", 10);
alert(rabbit.name); // White Rabbit
alert(rabbit.earLength); // 10
Super: internals, HomeObject
μ°Έκ³
μ΄ νν 리μΌμ μ²μ μ½λ κ²½μ° μ΄ μΉμ μ 건λ λΈ μ μλ€.
superμ μμ λ΄λΆ λ©μ»€λμ¦μ κ΄ν κ²μ΄λ€.
superλ₯Ό μ’ λ κΉκ² νμ
ν΄ λ³΄μ. μ΄ κ³Όμ μμ ν₯λ―Έλ‘μ΄ κ²λ€μ λ³΄κ² λ κ²μ΄λ€.
superκ° κΈ°μ μ μΌλ‘ μ΄λ»κ² μλν΄μΌνλμ§ μ€μ€λ‘μκ² λ¬Όμ΄ λ³΄μ. κ°μ²΄ λ©μλκ° μ€νλ λ, κ°μ²΄ λ©μλλ νμ¬ κ°μ²΄λ₯Ό thisλ‘ κ°μ§λ€. super.method() νΈμΆνλ©΄ μμ§μ methodλ₯Ό μ΄ νμ¬ κ°μ²΄μ νλ‘ν νμ
μμ κ°μ ΈμμΌνλ€. κ·Έλ¬λ μ΄λ»κ² κ°μ Έμ¬κΉ?
λ¨μ ν΄ λ³΄μΌ μ μμ§λ§ κ·Έλ μ§ μλ€. μμ§μ νμ¬ κ°μ²΄( this)λ₯Ό μκ³ μμΌλ―λ‘, λΆλͺ¨λ₯Ό methodλ₯Ό this.__proto__.methodλ‘μ¨ κ°μ Έμ¬ μ μμκ²λ§ κ°λ€. λΆννλ μ΄λ¬ν "μμ§ν" μ루μ
μ μλνμ§ μλλ€.
λ¬Έμ κ° λ¬΄μμΌκΉ? ν΄λμ€κ° μμΌλ©΄ λ¨μμ±μ μν΄ μΌλ° κ°μ²΄λ₯Ό μ¬μ©νλ€.
μΈλΆ μ¬νμ μκΈ°λ₯Ό μνμ§ μμΌλ©΄ μ΄ λΆλΆμ 건λλ°κ³ νμ μΉμ
μΈ [HomeObject](/Lee-hyuna/33-js-concepts-kr/wiki/HomeObject)μΌλ‘ μ΄λν΄λ λλ€ . λ¬Έμ λμ§ μλλ€. νμ§λ§ κΉμ΄ μ΄ν΄νλ λ° κ΄μ¬μ΄ μλ€λ©΄ κ³μ μ½μ΄λ³΄μ.
μλ μμμ rabbit.__proto__ = animalλ₯Ό 보λΌ. μ΄μ rabbit.eat()μμμ this.__proto__λ₯Ό μ¬μ©ν΄μ animal.eat()λ₯Ό νΈμΆν΄λ³΄μ.
let animal = {
name: "Animal",
eat() {
alert(`${this.name} eats.`);
}
};
let rabbit = {
__proto__: animal, // rabbit.__proto__ = animal
name: "Rabbit",
eat() {
// that's how super.eat() could presumably work
this.__proto__.eat.call(this); // (*)
}
};
rabbit.eat(); // Rabbit eats.
(*) λΌμΈμ 보면 νλ‘ν νμ
( animal)μμ eatμ κ°μ Έμμ νμ¬ κ°μ²΄μ 컨ν
μ€νΈμμ νΈμΆνλ€. μ¬κΈ°μ μ€μν 건 .call(this)μ΄λ€. μλνλ©΄ this.__proto__.eat()μΌλ‘λ§ μ€ννλ€λ©΄, νμ¬ κ°μ²΄μ 컨ν
μ€νΈκ° μλ νλ‘ν νμ
μ 컨ν
μ€νΈ μμ μλ λΆλͺ¨μ eat μ€νν κ²μ΄λ€.
μμ μ½λλ μ€μ λ‘ μλνλλ‘ alertμ΄ λμνλ€.
μ΄μ 체μΈμ κ°μ²΄λ₯Ό νλ λ μΆκ°ν΄λ³΄μ. μ΄λ»κ² λ§κ°μ§λμ§ λ³Ό κ²μ΄λ€.:
let animal = {
name: "Animal",
eat() {
alert(`${this.name} eats.`);
}
};
let rabbit = {
__proto__: animal,
eat() {
// ...bounce around rabbit-style and call parent (animal) method
this.__proto__.eat.call(this); // (*)
}
};
let longEar = {
__proto__: rabbit,
eat() {
// ...do something with long ears and call parent (rabbit) method
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μ΄λ€.
// inside longEar.eat() we have this = longEar
this.__proto__.eat.call(this) // (**)
// becomes
longEar.__proto__.eat.call(this)
// that is
rabbit.eat.call(this);
- κ·Έλ° λ€μ
rabbit.eatμ(*)λΌμΈμμ , λ λμ 체μΈμ μλ ν¨μλ₯Ό νΈμΆνκ³ μΆμ§λ§this=longEarμ΄λ€ . λ°λΌμthis.__proto__.eatλ λ€μrabbit.eatκ° λλ€.
// inside rabbit.eat() we also have this = longEar
this.__proto__.eat.call(this) // (*)
// becomes
longEar.__proto__.eat.call(this)
// or (again)
rabbit.eat.call(this);
- λ°λΌμ
rabbit.eatνΈμΆμ λ μ΄μ μ¬λΌκ° μ μκΈ° λλ¬Έμ νΈμΆμ μκΈ° μμ μ λμ μμ΄ νΈμΆνλ€.
μ΄ λ¬Έμ λ thisλ§μ μ¬μ©ν΄μ ν΄κ²°ν μ μλ€.
[HomeObject](/Lee-hyuna/33-js-concepts-kr/wiki/HomeObject)
ν΄κ²°μ±
μ μ 곡νκΈ° μν΄ JavaScriptλ ν¨μμ λν λ΄λΆ μμ±μΈ [HomeObject](/Lee-hyuna/33-js-concepts-kr/wiki/HomeObject)μ μΆκ°νλ€.
ν¨μκ° ν΄λμ€ λλ κ°μ²΄ λ©μλλ‘ μ§μ λλ©΄ [HomeObject](/Lee-hyuna/33-js-concepts-kr/wiki/HomeObject)μμ±μ΄ ν΄λΉ κ°μ²΄κ°λ©λλ€.
κ·Έλ° λ€μ superκ° [HomeObject](/Lee-hyuna/33-js-concepts-kr/wiki/HomeObject) μμ±μ μ¬μ©νμ¬ μμ νλ‘ν νμ
μ μ°κ²°νλ€.
λ¨Όμ μΌλ° κ°μ²΄λ‘ μλ λ°©μμ μ΄ν΄λ³΄μ.
let animal = {
name: "Animal",
eat() { // animal.eat.[HomeObject](/Lee-hyuna/33-js-concepts-kr/wiki/HomeObject) == animal
alert(`${this.name} eats.`);
}
};
let rabbit = {
__proto__: animal,
name: "Rabbit",
eat() { // rabbit.eat.[HomeObject](/Lee-hyuna/33-js-concepts-kr/wiki/HomeObject) == rabbit
super.eat();
}
};
let longEar = {
__proto__: rabbit,
name: "Long Ear",
eat() { // longEar.eat.[HomeObject](/Lee-hyuna/33-js-concepts-kr/wiki/HomeObject) == longEar
super.eat();
}
};
// works correctly
longEar.eat(); // Long Ear eats.
[HomeObject](/Lee-hyuna/33-js-concepts-kr/wiki/HomeObject)μΌλ‘ μΈν΄ μλ νλλ‘ λμνλ€. longEar.eatμ κ°μ λ©μλλ [HomeObject](/Lee-hyuna/33-js-concepts-kr/wiki/HomeObject)μ μκΈ°λλ¬Έμ thisλ₯Ό μ¬μ©νμ§ μκ³ λ λΆλͺ¨ λ©μλλ₯Ό νλ‘ν νμ
μμ κ°μ Έμ¨λ€.
λ©μλλ μμ κ° μλλ€
μ°λ¦¬κ° μ΄μ μ μκ³ μλ―μ΄, μΌλ°μ μΌλ‘ ν¨μλ "μμ "μ΄λ©° JavaScriptμ κ°μ²΄μ λ°μΈλ©λμ§ μλλ€. λ°λΌμ κ°μ²΄κ°μ 볡μ¬νμ¬ λ€λ₯Έ κ°μ²΄μ thisμ ν¨κ» νΈμΆ ν μ μλ€.
κ·Έλ¬λ [HomeObject](/Lee-hyuna/33-js-concepts-kr/wiki/HomeObject)μ μ‘΄μ¬ μμ²΄κ° κ·Έ μμΉμ μλ°νλ€. [HomeObject](/Lee-hyuna/33-js-concepts-kr/wiki/HomeObject)λ³κ²½ν μ μμΌλ―λ‘ λ°μΈλ©μ μμν μ§μλλ€.
[HomeObject](/Lee-hyuna/33-js-concepts-kr/wiki/HomeObject)κ° μ¬μ©λλ μ μΌν μ₯μ λ superμ΄λ€. λ°λΌμ, superλ₯Ό μ¬μ©νμ§ μλ λ©μλμΌ κ²½μ°μ μμ λ‘κ³ λ³΅μ¬κ° κ°λ₯νλ€. .κ·Έλ¬λ superλ₯Ό μ¬μ©νλ€λ©΄ μν©μ΄ μλͺ» λ μ μλ€.
superμ¬μ©ν λ©μλλ₯Ό 볡μ¬νμ¬ μλͺ»λ κ²½μ°λ λ€μκ³Ό κ°λ€.
let animal = {
sayHi() {
console.log(`I'm an animal`);
}
};
// rabbit inherits from animal
let rabbit = {
__proto__: animal,
sayHi() {
super.sayHi();
}
};
let plant = {
sayHi() {
console.log("I'm a plant");
}
};
// tree inherits from plant
let tree = {
__proto__: plant,
sayHi: rabbit.sayHi // (*)
};
tree.sayHi(); // I'm an animal (?!?)
tree.sayHi()λ₯Ό νΈμΆνλ©΄ "Iβm an animal"μ΄ μΆλ ₯λλ€. λΆλͺ
ν μλͺ»λλ€..
μ΄μ λ κ°λ¨νλ€.
(*)λΌμΈμμ λ©μλtree.sayHiλ©μλλrabbitμμ 볡μ¬λμμ΅λλ€ μ½λ μ€λ³΅μ νΌνκ³ μΆμμκΉ?rabbitμμ λ§λ€μ΄ μ‘κΈ° λλ¬Έμ[HomeObject](/Lee-hyuna/33-js-concepts-kr/wiki/HomeObject)λrabbitμ΄λ€.[HomeObject](/Lee-hyuna/33-js-concepts-kr/wiki/HomeObject)λ₯Ό λ³κ²½ν μ μλ€.tree.sayHi()μ μ½λ λ΄λΆμsuper.sayHi()κ° μλ€.super.sayHi()λanimalμ μλ λ©μλλ₯Ό κ°μ Έμ¨λ€.
λ€μμ μ΄λ»κ² μ§νλλμ§μ λν κ·Έλ¦Όμ΄λ€.
λ©μλλ ν¨μ(function) ννκ° λλ©΄ μλλ€.
ν΄λμ€μ μΌλ° κ°μ²΄μμ [HomeObject](/Lee-hyuna/33-js-concepts-kr/wiki/HomeObject)λ λ©μλλ₯Ό μν΄ μ μλλ€. κ·Έλ¬λ κ°μ²΄μ κ²½μ°, λ©μλκ° "method: function()"μλ method()λ‘ μ ννκ² μ§μ λμ΄μΌνλ€.
μ°λ¦¬κ° λλΌκΈ°μ μ€μνμ§ μλ κ² μ²λΌ 보μ΄μ§λ§, JavaScriptμλ μ€μνλ€.
μλ μμ μμ λΉ λ©μλ κ΅¬λ¬Έμ΄ λΉκ΅μ μ¬μ©λλ€. [HomeObject](/Lee-hyuna/33-js-concepts-kr/wiki/HomeObject)μμ±μ΄ μ€μ λμ§ μκ³ μμμ΄ μλνμ§ μλλ€.
let animal = {
eat: function() { // intentially writing like this instead of eat() {...
// ...
}
};
let rabbit = {
__proto__: animal,
eat: function() {
super.eat();
}
};
rabbit.eat(); // Error calling super (because there's no [HomeObject](/Lee-hyuna/33-js-concepts-kr/wiki/HomeObject))
μμ½
- Parent ν΄λμ€λ₯Ό Child ν΄λμ€κ° μμνλ €λ©΄
class Child extends Parent:- μ΄ μλ―Έλ λ©μλκ° μμλλλ‘
Child.prototype.__proto__μ΄Parent.prototypeλ κ²μ΄λ μλ―Έμ΄λ€.
- μ΄ μλ―Έλ λ©μλκ° μμλλλ‘
- μμ±μλ₯Ό μ€λ²λΌμ΄λ© νλ κ²½μ° :
thisλ₯Ό μ¬μ©νκΈ°μ μ λ¨Όμ ,Childν΄λμ€μ μμ±μμμsuper()λ₯Ό μ΄μ©ν΄ λΆλͺ¨μ μμ±μλ₯Ό νΈμΆν΄μΌνλ€.
- λ©μλλ₯Ό μ€λ²λΌμ΄λ©νλ κ²½μ° :
Childλ©μλμμsuper.method()λ₯Ό μ¬μ©ν΄Parentλ©μλλ₯Ό νΈμΆν μ μλ€.
- λ΄λΆ :
- λ©μλλ λ΄λΆ
[HomeObject](/Lee-hyuna/33-js-concepts-kr/wiki/HomeObject)μμ±μ ν΅ν΄ μμ μ ν΄λμ€/κ°μ²΄λ₯Ό κΈ°μ΅νλ€. μ΄κ²μ΄superλ₯Ό ν΅ν΄ λΆλͺ¨μ μ κ·Όμ΄ κ°λ₯ν μ΄μ λ€. - λ°λΌμ ν κ°μ²΄μμ λ€λ₯Έ κ°μ²΄λ‘
superλ₯Ό μ΄μ©ν΄ λ©μλλ₯Ό 볡μ¬νλ κ²μ μμ νμ§ μλ€..
- λ©μλλ λ΄λΆ
λν:
- νμ΄ν ν¨μλ
thisλλsuperλ₯Ό κ°κ³ μμ§ μλ€. λ°λΌμ μ¬μ©ν λλ μ£Όμνμ.