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
HomeObject
Super: internals,μ°Έκ³
μ΄ νν 리μΌμ μ²μ μ½λ κ²½μ° μ΄ μΉμ μ 건λ λΈ μ μλ€.
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
λ₯Ό κ°κ³ μμ§ μλ€. λ°λΌμ μ¬μ©ν λλ μ£Όμνμ.