Understanding Classes in JavaScript - Lee-hyuna/33-js-concepts-kr GitHub Wiki
μκ°
JavaScriptλ νλ‘ν νμ
κΈ°λ° μΈμ΄μ΄λ©°, JavaScriptμ λͺ¨λ κ°μ²΄μλ [Prototype](/Lee-hyuna/33-js-concepts-kr/wiki/Prototype)
μ΄λΌλ μ¨κ²¨μ§ λ΄λΆ μμ±μ΄ μμ΄ κ°μ²΄ νΉμ± λ° λ©μλλ₯Ό νμ₯νλ λ° μ¬μ©ν μ μμ΅λλ€.
μ΅κ·ΌκΉμ§λ κ°λ°μλ€μ JavaScriptμμ κ°μ²΄ μ§ν₯ μ€κ³ ν¨ν΄μ λͺ¨λ°©νκΈ° μν΄ constructor functionμ μ¬μ©νμ΅λλ€. ECMAScript 2015 μΈμ΄ μ¬μμ μ’
μ’
ES6μΌλ‘ λΆλ¦¬λ©° JavaScript μΈμ΄μ ν΄λμ€
λ₯Ό λμ
νμ΅λλ€. JavaScriptμ ν΄λμ€λ μ€μ λ‘ μΆκ° κΈ°λ₯μ μ 곡νμ§ μμΌλ©°, λ κΉ¨λνκ³ κ°κ²°ν λ¬Έλ²μ μ 곡νλ€λ μ μμ νλ‘ν νμ
κ³Ό μμμ λν΄ "syntactical sugar"λ₯Ό μ 곡νλ κ²μΌλ‘ μ€λͺ
λκΈ°λ ν©λλ€. λ€λ₯Έ νλ‘κ·Έλλ° μΈμ΄μμλ ν΄λμ€λ₯Ό μ¬μ©νκΈ° λλ¬Έμ JavaScriptμ ν΄λμ€ κ΅¬λ¬Έμ μ¬μ©νλ©΄ κ°λ°μκ° μΈμ΄ κ°μ μ½κ² μ΄λν μ μμ΅λλ€.
- syntactical sugar? https://web-front-end.tistory.com/26
Classes Are Functions
JavaScript ν΄λμ€λ ν¨μ μ νμ
λλ€. ν΄λμ€λ class
ν€μλλ‘ μ μΈλ©λλ€. ν¨μ μ ꡬ문μ μ¬μ©νμ¬ ν¨μλ₯Ό μ΄κΈ°ννκ³ ν΄λμ€ μ ꡬ문μ μ¬μ©νμ¬ ν΄λμ€λ₯Ό μ΄κΈ°νν©λλ€.
// Initializing a function with a function expression
const x = function() {}
// Initializing a class with a class expression
const y = class {}
Object.getPrototypeOf()
λ©μλλ₯Ό μ¬μ©νμ¬ κ°μ²΄μ [Prototype](/Lee-hyuna/33-js-concepts-kr/wiki/Prototype)
μ μ‘μΈμ€ν μ μμ΅λλ€. μ΄κ±Έ μ¬μ©νμ¬ λΉ functionμ μμ±νλλ‘ νκ² μ΅λλ€.
Object.getPrototypeOf(x);
// Output
Ζ () { [native code] }
classλ₯Ό μμ±νμ¬ μ¬μ©ν μ μμ΅λλ€.
Object.getPrototypeOf(y);
// Output
Ζ () { [native code] }
ν¨μ λ° ν΄λμ€λ‘ μ μΈλ μ½λλ ν¨μ [Prototype](/Lee-hyuna/33-js-concepts-kr/wiki/Prototype)
μ λ°νν©λλ€. νλ‘ν νμ
μ μ¬μ©νλ©΄ λͺ¨λ κΈ°λ₯μ΄ μλ‘μ΄ ν€μλλ₯Ό μ¬μ©νμ¬ μμ±μ μΈμ€ν΄μ€κ° λ μ μμ΅λλ€.
const x = function() {}
// Initialize a constructor from a function
const constructorFromFunction = new x();
console.log(constructorFromFunction);
// Output
x {}
constructor: Ζ ()
classesλ μ μ©λ©λλ€.
const y = class {}
// Initialize a constructor from a class
const constructorFromClass = new y();
console.log(constructorFromClass);
// Output
y {}
constructor: class
μ΄λ¬ν νλ‘ν νμ Constructor μμλ λΉμ΄ μμ§λ§, ꡬ문 μλμμλ λ λ°©λ² λͺ¨λ λμΌν κ²°κ³Όλ₯Ό λμΆν΄κ°λ λ°©λ²μ νμΈν μ μμ΅λλ€.
Defining a Class
μμ±μ ν¨μλ ν¨μ μ체λ₯Ό μ°Έμ‘°νμ¬ μ¬λ¬ 맀κ°λ³μλ₯Ό μ¬μ©νμ¬ μ΄κΈ°νλ©λλ€. μλ³μμ 첫 λ²μ§Έ λ¬Έμλ κ΄λ‘μ λ°λΌ λλ¬Έμλ‘ νμλ©λλ€.
constructor.js
// Initializing a constructor function
function Hero(name, level) {
this.name = name;
this.level = level;
}
μ΄κ²μ ν΄λμ€ κ΅¬λ¬Έ(class syntax)μΌλ‘ λ³νν΄ λ³΄λ©΄, λ§€μ° μ μ¬ν κ΅¬μ‘°λ‘ λμ΄ μμμ μ μ μμ΅λλ€.
class.js
// Initializing a class definition
class Hero {
constructor(name, level) {
this.name = name;
this.level = level;
}
}
μμ±μ ν¨μλ initializerμ 첫 λ²μ§Έ λ¬Έμ(μ ν μ¬ν)μ λλ¬Έμ λ° κ΅¬λ¬Έμ λν μ΅μν¨ ν΅ν΄ κ°μ²΄ Blueprintλ₯Ό μλ―Ένλ€λ κ²μ μκ³ μμ΅λλ€. ν΄λμ€ ν€μλλ μ°λ¦¬ κΈ°λ₯μ λͺ©νλ₯Ό λ³΄λ€ μ§μ€μ μΌλ‘ μ λ¬ν©λλ€.
μ΄κΈ°ν ꡬ문μ μ μΌν μ°¨μ΄μ μ ν¨μ λμ class
ν€μλλ₯Ό μ¬μ©νκ³ constroctor()
λ©μλ λ΄μ μμ±μ ν λΉνλ κ²μ
λλ€.
Defining Methods
μμ±μ κΈ°λ₯μ μΌλ°μ μΌλ‘ μλ greet()
λ°©λ²μμ λ³Ό μ μλ―μ΄, μ΄κΈ°ν λμ νλ‘ν νμ
μ μ§μ λ©μλλ₯Ό ν λΉνλ κ²μ
λλ€.
constructor.js
function Hero(name, level) {
this.name = name;
this.level = level;
}
// Adding a method to the constructor
Hero.prototype.greet = function() {
return `${this.name} says hello.`;
}
ν΄λμ€λ₯Ό μ¬μ©νλ©΄ λ¬Έλ², κ΅¬λ¬Έμ΄ λ¨μνλκ³ λ©μλλ₯Ό ν΄λμ€μ μ§μ μΆκ°ν μ μμ΅λλ€. ES6μμ μκ°ν λ°©λ²μ μ¬μ©νλ©΄ μ μΈμ μ μνλ κ²μ΄ ν¨μ¬ λ μ½λλ€μ΄ κ°κ²°ν΄μ§κ² λ©λλ€.
class.js
class Hero {
constructor(name, level) {
this.name = name;
this.level = level;
}
// Adding a method to the constructor
greet() {
return `${this.name} says hello.`;
}
}
μ΄λ¬ν νΉμ± λ° μ€ν λ°©λ²μ μ΄ν΄λ³΄κ² μ΅λλ€. new
ν€μλλ₯Ό μ¬μ©νμ¬ Heroμ μλ‘μ΄ μΈμ€ν΄μ€λ₯Ό λ§λ€κ³ λͺ κ°μ§ κ°μ ν λΉν κ²μ
λλ€.
const hero1 = new Hero('Varg', 1);
console.log(hero1)
λ₯Ό μ¬μ©νμ¬ μ κ°μ²΄μ λν μμΈν μ 보λ₯Ό μΆλ ₯νλ©΄ ν΄λμ€ μ΄κΈ°νμ λν΄ μμΈν μ μ μμ΅λλ€.
Output
Hero {name: "Varg", level: 1}
__proto__:
βΆ constructor: class Hero
βΆ greet: Ζ greet()
hero1
μ νΈμΆλ‘ constructor()
μ greet()
μ κ°μ λν ν λΉμ΄ __proto__
λλ Prototypeμ μ μ©λμλ€λ κ²μ
console.log`μμ νμΈν μ μμ΅λλ€.
Extending a Class
μμ±μ κΈ°λ₯ λ° ν΄λμ€μ μ΄μ μ μμ νλͺ©μ κΈ°λ°μΌλ‘ μ κ°μ²΄λ‘ νμ₯ν μ μλ€λ κ²μ λλ€. μ΄λ κ² νλ©΄ λΉμ·νμ§λ§ λͺ κ°μ§ μΆκ° κΈ°λ₯ λλ κ·Έ μ΄μμ νΉμ κΈ°λ₯μ΄ νμν κ°μ²΄μ λν μ½λκ° λ°λ³΅λμ§ μμ΅λλ€.
μλ‘μ΄ μμ±μ functionμ΄ μμ±μ΄ λλ©΄ call()
λ©μλλ₯Ό λΆλͺ¨μκ² μ°κ²°ν΄μ€λλ€. μλ₯Όλ€μ΄, Mage
λΌλ classλ₯Ό λ§λ€κ³ call()
μ μ¬μ©νμ¬ Hero
μ μμ±μ ν λΉνκ³ , μΆκ° μμ±μ μΆκ°ν κ²μ
λλ€.
constructor.js
// Creating a new constructor from the parent
function Mage(name, level, spell) {
// Chain constructor with call
Hero.call(this, name, level);
this.spell = spell;
}
μ¬κΈ°μ ν¬μΈνΈλ Hero
λ Mage
μ μλ‘μ΄ μΈμ€ν΄μ€κ° μμ±μ΄ λλ©΄μ νλ‘νΌν°λ₯Ό ν λΉλ°κ² λ©λλ€.
const hero2 = new Mage('Lejon', 2, 'Magic Missile');
hero2
λ₯Ό μ½μμ μ°μ΄λ³΄κ² λλ©΄ Mageλ₯Ό ν΅ν΄ μλ‘μ΄ μμ±μλΌ μμ±μ΄ λ κ²μ λ³Ό μ μμ΅λλ€.
Output
Mage {name: "Lejon", level: 2, spell: "Magic Missile"}
__proto__:
βΆ constructor: Ζ Mage(name, level, spell)
ES6 ν΄λμ€ μ€ super
λΌλ ν€μλκ° μμ΅λλ€. μ΄ ν€μλλ call
λμ λΆλͺ¨ functionμ λν κΈ°λ₯μ μ‘μΈμ€νκ² λ©λλ€. λΆλͺ¨μ classλ₯Ό νμ₯νκΈ° μν΄ μ¬μ©λ©λλ€.
class.js
// Creating a new class from the parent
class Mage extends Hero {
constructor(name, level, spell) {
// Chain constructor with super
super(name, level);
// Add a new property
this.spell = spell;
}
}
λμΌν λ°©μμΌλ‘ Mage
μ μλ‘μ΄ μΈμ€ν΄μ€λ₯Ό μμ±ν©λλ€.
const hero2 = new Mage('Lejon', 2, 'Magic Missile');
hero2λ₯Ό μ½μλ‘ μ°μ΄λ³΄λ©΄,
Output
Mage {name: "Lejon", level: 2, spell: "Magic Missile"}
__proto__: Hero
βΆ constructor: class Mage
μΆλ ₯μ κ±°μ λμΌν©λλ€. λ¨, ν΄λμ€ κ΅¬μ±μμ [Prototype](/Lee-hyuna/33-js-concepts-kr/wiki/Prototype)
μ΄ λΆλͺ¨(Hero)μ μ°κ²°λ©λλ€.
λ€μμ μ 체 μ΄κΈ°ν νλ‘μΈμ€, μΆκ° λ°©λ², μμ±μ ν¨μ λ° ν΄λμ€μ μμμ λλν λΉκ΅ν κ²μ
λλ€.
constructor.js
function Hero(name, level) {
this.name = name;
this.level = level;
}
// Adding a method to the constructor
Hero.prototype.greet = function() {
return `${this.name} says hello.`;
}
// Creating a new constructor from the parent
function Mage(name, level, spell) {
// Chain constructor with call
Hero.call(this, name, level);
this.spell = spell;
}
class.js
// Initializing a class
class Hero {
constructor(name, level) {
this.name = name;
this.level = level;
}
// Adding a method to the constructor
greet() {
return `${this.name} says hello.`;
}
}
// Creating a new class from the parent
class Mage extends Hero {
constructor(name, level, spell) {
// Chain constructor with super
super(name, level);
// Add a new property
this.spell = spell;
}
}
λκ°μ λ¬Έλ²μ μλΉν λ€λ₯΄μ§λ§ λ λ°©λ² λͺ¨λ κΈ°λ³Έ κ²°κ³Όλ κ±°μ λμΌν©λλ€. ν΄λμ€λ₯Ό ν΅ν΄ κ°μ²΄λ₯Ό λ³΄λ€ κ°κ²°νκ² μμ±ν μ μμΌλ©°, μμ±μ κΈ°λ₯μ hood μλμμ λ°μνλ μμ μ λ³΄λ€ μ ννκ² μ€λͺ ν©λλ€.
κ²°λ‘
μ΄ λ³Έλ¬Έμ JavaScript μμ±μ κΈ°λ₯κ³Ό ES6 ν΄λμ€ κ°μ μ μ¬μ κ³Ό μ°¨μ΄μ μ λν΄ μμ 보μμ΅λλ€. ν΄λμ€ λ° μμ±μλ λͺ¨λ νλ‘ν νμ κΈ°λ° μμ μΈμ΄μΈ JavaScriptμ κ°μ²΄ μ§ν₯ μμ λͺ¨λΈμ λͺ¨λ°©ν©λλ€.
ν¨κ³Όμ μΈ JavaScript κ°λ°μκ° λκΈ° μν΄μλ νλ‘ν νμ μμμ μ΄ν΄νλ κ²μ΄ 무μλ³΄λ€ μ€μν©λλ€. Reactμ κ°μ μΈκΈ° μλ JavaScript λΌμ΄λΈλ¬λ¦¬κ° ν΄λμ€ κ΅¬λ¬Έμ μμ£Ό μ¬μ©νλ―λ‘ ν΄λμ€μ μ΅μν΄μ§λ κ²μ΄ λ§€μ° μ μ©ν©λλ€.