μ°λ¦¬λ μλ°μ€ν¬λ¦½νΈμ νλ‘ν νμ
κΈμμ κ°μ²΄μ§ν₯μ΄ λ¬΄μμΈμ§ 곡λΆνλ€. λ€μ μ½κ³ μ€κΈ° μ«μ μ¬λλ€μ μν΄ μμ½νλ©΄ κ°μ²΄μ§ν₯μ΄λ, λ
립μ μΈ κ°μ²΄λ€μ μ§ν©μΌλ‘ νλ‘κ·Έλ¨μ νννλ €λ νλ‘κ·Έλλ° ν¨λ¬λ€μμ΄λ€.
μ¬κΈ°μ ν΄λμ€λ κ°μ²΄λ₯Ό μμ±ν μ μλ μΆμμ μΈ λμ νΉμ ꡬ체μ μΈ κ°μ²΄λ₯Ό μλ―Ένλ€. (μλ°μ€ν¬λ¦½νΈμ ν΄λμ€λ κ°μ²΄λ₯Ό μμ±νκΈ° μν νμ΄ λλ, λ³ΈμΈ μ€μ€λ‘ νλμ κ°μ²΄λ‘ μλνλμ λ°λΌμ μΆμμ μΈ λμλ ꡬ체μ μΈ κ°μ²΄λ λ μ μλ€)
ES5κΉμ§λ μλ°μ€ν¬λ¦½νΈμ classκ° μ§μλμ§ μμλ€. κ·Έλ¬λ ν΄λμ€ κΈ°λ° κ°μ²΄μ§ν₯ μΈμ΄λ₯Ό μ¬μ©νλ μλ§μ μ¬λλ€μ΄ μλ°μ€ν¬λ¦½νΈμ νλ‘ν νμ μ μ΄μ©ν΄ classλ₯Ό νλ΄λ΄λ³΄λ €κ³ μλν΄μλ€. νμ§λ§ classκ° μ΄λ―Έ λμ¨ μμ μΈ μ§κΈ, μ΄ κ³Όμ μ μμΈν μ΄ν΄λ³Ό νμλ μμ κ² κ°μ classλ₯Ό νλ΄λ΄λλ° μμ΄ ν΅μ¬μ μΈ μ κ·Ό λ°©λ²κ³Ό μμνλ μ λλ§ λ³΄μ¬μ£Όλ €κ³ νλ€.
μ¬λ¬ κ°μ§ λ°©λ²λ€μ΄ μμμ§λ§, μ κ·Ό λ°©λ²μ μλμ κ±°μ λμΌνλ€.
SubClass.prototype.__proto__
κ° SuperClass.prototype
μ μ°Έμ‘°νκ² νλ€.SubClass.prototype
μ λΆνμν μΈμ€ν΄μ€ νλ‘νΌν°κ° λ¨μμμ§ μκ² νλ€. SubClass.prototype.constructor
λ₯Ό SubClassλ‘ μ¬μ€μ ν΄μ€λ€.μ΄ κΈμμλ μΌλ°μ μΈ OOP(Object-Oriented Programming)λ°©μμΌλ‘ νλ‘ν νμ μ ν΄λμ€μ²λΌ μ΄μ©ν μ½λμ YOU DON'T KNOW JSμ μ μ, μΉ΄μΌ μ¬μ¨μ΄ μ§ν₯νλ OLOO(Object Linked Other Object)λ°©μμ μ¬μ©ν μ½λ λ κ°μ§λ₯Ό 보μ¬μ£Όλλ‘ νκ² λ€. λ λ€ μ΄λ°μμΌλ‘ ν΄λμ€λ₯Ό νλ΄ λꡬλ~ μ λλ‘λ§ λ°μλ€μ΄κ³ λ무 κΉκ² νκ³ λ€μ§ μμμΌλ©΄ μ’κ² λ€. μ΄ κΈμ "μ΄λ ν μ½λ μ€νμΌμ μ§ν₯ν΄μΌνλκ°"κ° μλ "μλ°μ€ν¬λ¦½νΈμ κΈ°μ΄ κ°λ "μ λ€λ£¨λ κΈμμ μμ§ λ§μ.
// κ³ μ μ μΈ νλ‘ν νμ
OOP μ€νμΌ
function Animal() {}
Animal.prototype.eat = function() {
return 'eat';
};
Animal.prototype.sleep = function() {
return 'sleep';
};
function Bird() {}
Bird.prototype = Object.create(Animal.prototype);
// Object.setPrototypeOf(Bird.prototype, Animal.prototype);
// ES6λΆν° νν ν νμ
μ κ΅μ²΄ν μ μλ λ€λ₯Έ λ°©λ²μ΄λ€.
// μ¬κΈ°μλ νμ§ μμμ§λ§ μλ constructorλ Birdλ‘ κ΅μ²΄ν΄μ€λ€
Bird.prototype.fly = function() {
return 'fly'
};
const eagle = new Bird();
console.log(eagle.fly(), eagle.eat(), eagle.sleep());
//fly eat sleep
//YOU DON'T KNOW JSμ μΉ΄μΌ μ¬μ¨μ OLOO μ€νμΌ
const Animal = {
eat() {
return 'eat';
},
sleep() {
return 'sleep';
},
};
const Bird = {
fly() {
return 'fly';
},
};
Object.setPrototypeOf(Bird, Animal);
const eagle = Object.create(Bird);
console.log(eagle.fly(), eagle.eat(), eagle.sleep());
(OOPλ°©μμμλ Object.prototype λ±λ± κ°μ²΄μμ μ§μ μ μΈ κ΄κ³κ° μλ건 κ·Έλ¦Όμ΄ λ³΅μ‘ν΄μ Έμ λΊλ€)
μ κΈμμλ μλ°μ€ν¬λ¦½νΈμ κΈ°λ³Έκ°λ
μ λ€λ£¨λκ² λͺ©μ μ΄κΈ° λλ¬Έμ μμμλ λ§νλ―μ΄ OOPλ°©μκ³Ό OLOOλ°©μμ λΉκ΅ κ°μ λ΄μ©μ κ°λ¨ν μκ°λ§ νκ³ λ§λ¬΄λ¦¬ νλλ‘ νκ² λ€. OLOOλ°©μμ ν΄λμ€λ₯Ό νλ΄λλ€κΈ°λ³΄λ€, 볡μ‘νκ³ λ¬Έμ λ§μ ν΄λμ€λ₯Ό μ¬μ©νλ λμ νλ‘ν νμ
μμμ μ΄λ° μμΌλ‘ μ¬μ©νμ~ λΌλ μ·¨μ§μμ λμ¨ λ°©μμ΄λ€.
μκΉλ λ§νμ§λ§ λ무 κΉκ² λ€μ΄κ°μ§λ λ§μ.
μ, κ·ΈλΌ μ΄μ 본격μ μΌλ‘ ES6μ λμ
λ ν΄λμ€μ λν΄μ μ΄ν΄λ³΄μ. μ°λ¦¬λ μλ°μ€ν¬λ¦½νΈμ κ°μ²΄μμ μ¬λ¬κ°μ§ κ°μ²΄ μμ±λ°©μλ€μ μ΄ν΄λ³΄μλ€. ν΄λμ€λ ES6μμ λμ
λ κ°μ²΄ μμ± λ°©μμ΄λ€.
κ·Έλ¬λ, ES6μ ν΄λμ€λ μ¬μ€ ν¨μμ΄λ©° κΈ°μ‘΄ νλ‘ν νμ
κΈ°λ° ν¨ν΄μ ν΄λμ€ κΈ°λ° ν¨ν΄μ²λΌ μ¬μ©ν μ μλλ‘ νλ λ¬Έλ²μ μ€ν(syntactic sugar)μ΄λΌκ³ λ³Ό μλ μλ€.
μ΄μ λΆν°λ ν΄λμ€μ λ¬Έλ², κΈ°λ₯, λμλ°©μ, μμ±μ ν¨μμμ μ°¨μ΄λ₯Ό μ€μ¬μΌλ‘ ν΄λμ€λ₯Ό μ€λͺ
ν΄λκ°κ² λ€.
λ¨Όμ ν¬κ² μμ±μ ν¨μμ λμμμ μ΄λ€ μ°¨μ΄κ° μλμ§λ₯Ό μ΄ν΄λ³΄λλ‘ νκ² λ€. ν΄λμ€μ μμ±μ ν¨μλ λͺ¨λ νλ‘ν νμ μ κΈ°λ°μ μΈμ€ν΄μ€λ₯Ό μμ±νμ§λ§ μ νν λμΌνκ² λμνμ§λ μλλ€. ν΄λμ€λ μμ±μ ν¨μλ³΄λ€ μ격νλ©° μμ±μ ν¨μμμλ μ 곡νμ§ μλ κΈ°λ₯λ μ 곡νλ€.
ν΄λμ€λ μμ±μ ν¨μμ λ§€μ° μ μ¬νκ² λμνμ§λ§ λ€μκ³Ό κ°μ΄ λͺ κ°μ§ μ°¨μ΄κ° μλ€.
// ν΄λμ€ μ μΈλ¬Έ
class Person {}
// μ΅λͺ
ν΄λμ€ ννμ
const Person = class {};
// κΈ°λͺ
ν΄λμ€
const Person = class MyClass = {};
ν΄λμ€λ class ν€μλλ‘ μ μ, μΌλ°μ μ΄μ§ μμ§λ§ ννμμΌλ‘λ μ μν μ μλ€. ννμμΌλ‘ ν΄λμ€λ₯Ό μ μν μ μλ€λ κ²μ ν΄λμ€κ° κ°μΌλ‘ μ¬μ©ν μ μλ μΌκΈ κ°μ²΄λΌλ κ²μ μλ―Ένλ€. μκΉλ λ§νμ§λ§ ν΄λμ€λ ν¨μμ΄λ€. μμ§ ν¨μμ λν΄μ μ€λͺ νμ§ μμμ§λ§, ν¨μλ κ°μ²΄μ΄λ©°, κ°μ²΄ μ€μ μΌκΈκ°μ²΄μ΄λ€.
ν΄λμ€λ μΌκΈ κ°μ²΄λ‘μ λ€μκ³Ό κ°μ νΉμ§μ κ°λλ€.
ν΄λμ€ λͺΈμ²΄μλ 0κ° μ΄μμ λ©μλλ§ μ μν μ μλ€. ν΄λμ€ λͺΈμ²΄μ μ μν μ μλ λ©μλλ constructor(μμ±μ), νλ‘ν νμ λ©μλ, μ μ λ©μλμ΄λ€.
class Person {
// μμ±μ
constructor(name) {
this.name = name;
}
// νλ‘ν νμ
λ©μλ
sayHi() {
console.log('Hi');
}
// μ μ λ©μλ
static sayHello() {
console.log('Hello');
}
}
ν΄λμ€μ νλ‘ν νμ λ©μλ, μ μ λ©μλλ₯Ό μ μνλ λ¬Έλ²κ³Ό μμ±μ ν¨μμμ μ΄λ€μ μμ±νλ λ¬Έλ²μ΄ μ΄λ»κ² λ€λ₯Έμ§λ μ§μ μ°Ύμ보λλ‘ νμ. μ½κ² μ°Ύμλ³Ό μ μμκ±°λ€.
μλ°μ€ν¬λ¦½νΈμ μ€ν 컨ν μ€νΈμμ μ€λͺ νλ―μ΄ νΈμ΄μ€ν μ "λ³μ νΈμ΄μ€ν "κ³Ό "ν¨μ νΈμ΄μ€ν "μ΄ μ‘΄μ¬νλ€. ν΄λμ€ ννμμΌλ‘ μ μλ ν΄λμ€λ μ€λͺ ν νμλ μκ³ , ν΄λμ€ μ μΈλ¬ΈμΌλ‘ μ μλ ν΄λμ€μ νΈμ΄μ€ν μ λν΄μλ§ μ΄ν΄λ³΄μ.
λ¨Όμ , ν΄λμ€λ ν¨μλ‘ νκ°λκΈ° λλ¬Έμ ν΄λμ€ μ μΈλ¬ΈμΌλ‘ μ μν ν΄λμ€λ ν¨μ μ μΈλ¬Έκ³Ό κ°μ΄ μμ€μ½λ νκ° κ³Όμ , μ¦ λ°νμ μ΄μ μ λ¨Όμ νκ°λμ΄ ν¨μ κ°μ²΄λ₯Ό μμ±νλ€. μ΄ λ, ν΄λμ€κ° νκ°λμ΄ μμ±λ ν¨μ κ°μ²΄λ μμ±μ ν¨μλ‘μ νΈμΆν μ μλ ν¨μ, μ¦ constructorλ€. (μ΄ λ νλ‘ν νμ λ ν¨κ» μμ±λλ€. νλ‘ν νμ μ ν¨μ μ μκ° νκ°λμ΄ ν¨μ κ°μ²΄λ₯Ό μμ±νλ μμ λλ©°, ν¨μ κ°μ²΄μ μ§(pair)μΌλ‘ μ‘΄μ¬νλ€.)
λ¨, ν΄λμ€λ ν΄λμ€ μ μ μ΄μ μ μ°Έμ‘°ν μ μλ€. let, const ν€μλλ‘ μ μΈν λ³μμ²λΌ νΈμ΄μ€ν λκΈ° λλ¬Έμ μ μΈλ¬Έ μ΄μ μ TDZμ λΉ μ§κΈ° λλ¬Έμ νΈμ΄μ€ν μ΄ λ°μνμ§ μλ κ²μ²λΌ λμνλ€.
const Crew = '';
{
console.log(Crew); // ReferenceError: Cannot access 'Crew' before initialization
class Crew {};
}
μμ²λΌ νΈμ΄μ€ν μ΄ let, constμΌλ‘ μ μΈν λ³μ νΈμ΄μ€ν κ³Ό λμΌνκ² λ°μνλ€.
ν΄λμ€ λͺΈμ²΄μλ constructor, νλ‘ν νμ λ©μλ, μ μ λ©μλλ§ μ μν μ μλ€κ³ νλ€. μμμ ν΄λμ€λ₯Ό μ΄λ»κ² μ μνλμ§ μ΄ν΄λ΄€μΌλ, μ΄μ λ΄λΆμμλ€μ κ°κ° λ―μ΄μ μ΄ν΄λ³΄μ.
constructorλ μΈμ€ν΄μ€λ₯Ό μμ±νκ³ μ΄κΈ°ννκΈ° μν νΉμν λ©μλλ€. μμ±μ ν¨μμ λ§μ°¬κ°μ§λ‘ constructor λ΄λΆμμ thisμ μΆκ°ν νλ‘νΌν°λ μΈμ€ν΄μ€ νλ‘νΌν°κ° λλ€. constructor λ΄λΆμ thisλ μμ±μ ν¨μμ λ§μ°¬κ°μ§λ‘ ν΄λμ€κ° μμ±ν μΈμ€ν΄μ€λ₯Ό κ°λ¦¬ν¨λ€.
κ·Έλ¬λ constructorλ λ¨μν λ©μλκ° μλλ€. constructorλ λ©μλλ‘ ν΄μλλ κ²μ΄ μλλΌ ν΄λμ€κ° νκ°λμ΄ μμ±ν ν¨μ κ°μ²΄ μ½λμ μΌλΆκ° λλ€. λ€μ λ§ν΄, ν΄λμ€ μ μκ° νκ°λλ©΄ constructorμ κΈ°μ λ λμμ νλ ν¨μ κ°μ²΄κ° μμ±λλ€.
constructorλ μμ±μ ν¨μμ μ μ¬νμ§λ§ λͺ κ°μ§ μ°¨μ΄κ° μλ€.
class Person {
constructor(name) {
this.name = name;
}
}
const harry = new Person('Harry');
console.log(harry); // Person {name: 'Harry'}
μΈμ€ν΄μ€λ₯Ό μμ±ν λ ν΄λμ€ μΈλΆμμ μΈμ€ν΄μ€ νλ‘νΌν°μ μ΄κΈ°κ°μ μ λ¬νλ €λ©΄ μμ κ°μ΄ constructorμ 맀κ°λ³μλ₯Ό μ μΈνκ³ μΈμ€ν΄μ€λ₯Ό μμ±ν λ μ΄κΈ°κ°μ μ λ¬νλ€. μ΄λ μ΄κΈ°κ°μ constructorμ 맀κ°λ³μμκ² μ λ¬λλ€.
μ΄μ²λΌ constructor λ΄μμλ μΈμ€ν΄μ€μ μμ±κ³Ό λμμ μΈμ€ν΄μ€ νλ‘νΌν°λ₯Ό μΆκ°λ₯Ό ν΅ν΄ μΈμ€ν΄μ€μ μ΄κΈ°νλ₯Ό μ€ννλ€. κ·Έλ¦¬κ³ constructorλ λ³λμ λ°νλ¬Έμ κ°μ§ μμμΌνλ€. μ΄λ μμ±μ ν¨μκ° λμνλ λ°©μκ³Ό λμΌνκ² λμνλ€. (κΈ°μ΅μ΄ μ λλ€λ©΄ μλ°μ€ν¬λ¦½νΈμ κ°μ²΄ μ΄κ±Έ μ½κ³ μ€μ)
μ¬λ΄μΌλ‘ λ§νμλ©΄ νλ‘ν νμ μ μλ constructor νλ‘νΌν°λ, ν¨μμ λ΄λΆ λ©μλ [[constructor]]μλ κ΄κ³κ° μλ€. ν·κ°λ¦¬μ§ μλλ‘ νμ. (μ€λ§ μ λμ λͺ¨λ₯΄λ건 μλκ² μ§..?)
μκΉ μμμ ν΄λμ€μ μμ±μ ν¨μμ νλ‘ν νμ
λ©μλ, μ μ λ©μλ μ μ λ¬Έλ²μ μ°¨μ΄λ₯Ό μ§μ μ°Ύμλ³΄λΌ νμ§λ§ μ¬μ€ μ¬κΈ°μ μ€λͺ
ν΄ μ€ μμ μ΄μλ€. μ΄μ μ§μ§ μ΄λ»κ² λ€λ₯Έμ§ μ΄ν΄λ³΄μ.
μμ±μ ν¨μλ₯Ό μ¬μ©νμ¬ μΈμ€ν΄μ€λ₯Ό μμ±ν λλ μλμ κ°μ΄ λͺ
μμ μΌλ‘ νλ‘ν νμ
μ λ©μλλ₯Ό μΆκ°ν΄μΌνλ€. νλ‘ν νμ
체μΈμ΄ μ΄λ€ μμΌλ‘ μ΄λ€μ§λμ§λ₯Ό ν λ² ν΄λμ€μ λΉκ΅ν΄μ μκ°ν΄λ³΄λ©΄ μ’μ κ² κ°λ€.
function Person(name) {
this.name = name;
}
Person.prototype.sayHi = function () {
console.log('Hi');
};
const harry = new Person('harry');
harry.sayHi(); // Hi
ν΄λμ€ λͺΈμ²΄μμ μ μν λ©μλλ μμ±μ ν¨μμ μν κ°μ²΄ μμ± λ°©μκ³Όλ λ€λ₯΄κ² ν΄λμ€μ prototype νλ‘νΌν°μ λ©μλλ₯Ό μΆκ°νμ§ μμλ κΈ°λ³Έμ μΌλ‘ νλ‘ν νμ λ©μλκ° λλ€.
class Person {
constructor(name) {
this.name = name;
}
sayHi() {
console.log('Hi!');
}
}
const harry = new Person('Harry');
harry.sayHi(); // Hi!
νλ‘ν νμ 체μΈμ΄ μ΄λ€ μμΌλ‘ μ΄λ€μ§λμ§ μκ°ν΄λ³΄μλκ°? μ¬μ€ νλ‘ν νμ 체μΈμ κΈ°μ‘΄μ λͺ¨λ κ°μ²΄ μμ± λ°©μ(κ°μ²΄ 리ν°λ΄, μμ±μ ν¨μ, Object.create λ©μλ λ±)λΏλ§ μλλΌ ν΄λμ€μ μν΄ μμ±λ μΈμ€ν΄μ€μλ λμΌνκ² μ μ©λλ€. μμ±μ ν¨μμ μν μ ν΄λμ€κ° ν λΏμ΄λ€.
κ²°κ΅ ν΄λμ€λ μμ±μ ν¨μμ κ°μ΄ μΈμ€ν΄μ€λ₯Ό μμ±νλ μμ±μ ν¨μλΌκ³ λ³Ό μ μλ€. κ²°κ΅ ν΄λμ€λ μμ±μ ν¨μμ λ§μ°¬κ°μ§λ‘ νλ‘ν νμ κΈ°λ°μ κ°μ²΄ μμ± λ©μ»€λμ¦μ΄λ€.
νλ‘ν νμ λ©μλλ₯Ό μ€λͺ νλ λ°©μκ³Ό λμΌνκ² μλ μ½λμμ λ¨Όμ μμ±μ ν¨μκ³Ό ν΄λμ€μ μ μ λ©μλ μ μ λ°©μμ μ°¨μ΄μ μ μμ보λλ‘ νκ² λ€.
// μμ±μ ν¨μμ μ μ λ©μλ
function Person(name) {
this.name = name;
}
Person.sayHi = function () {
console.log('Hi!');
}
// ν΄λμ€μ μ μ λ©μλ
class Person {
constructor(name) {
this.name = name;
}
static sayHi() {
console.log('Hi!');
}
}
λ¬Έλ² μμΌλ‘λ μ΄λ° μ°¨μ΄κ° μκ³ , μ μ λ©μλλ ν΄λμ€, μμ±μ ν¨μμ λ°μΈλ©λ λ©μλκ° λλ€. ν΄λμ€λ ν¨μ κ°μ²΄λ‘ ν΄λμ€ μ μκ° νκ°λλ μμ μ ν¨μ κ°μ²΄κ° λλ―λ‘ μΈμ€ν΄μ€μ λ¬λ¦¬ λ³λ€λ₯Έ μμ± κ³Όμ μ΄ νμ μλ€. μ μ λ©μλλ μΈμ€ν΄μ€λ‘ νΈμΆν μ μκ³ , ν΄λμ€λ‘ νΈμΆνλ€.
(νλ‘ν νμ
체μΈμ΄ μ΄λ»κ² μ°κ²°λμ΄μλμ§λ₯Ό μλ©΄ μ΄λ μκ°νλ©΄ λΉμ°ν μΌμ΄λ€.)
μ°λ¦¬λ μμμ ν΄λμ€κ° λμ§, ν΄λμ€λ₯Ό μ΄λ»κ² μ μνλμ§, ν΄λμ€ λͺΈμ²΄μμ μ μν μ μλ κ²λ€μ΄ μ΄λ€ μν λ€μ νλμ§ λͺ¨λ μμλ΄€λ€. ν΄λμ€λ κ°μ²΄λ₯Ό μμ±νκΈ° μν 맀컀λμ¦μ΄λ€. μ΄μ μ°λ¦¬λ ν΄λμ€κ° μ΄λ»κ² μΈμ€ν΄μ€(κ°μ²΄)λ₯Ό μμ±νλμ§ μμλ³Ό μ μλ€. ν΄λμ€λ μλμ κ°μ μμλ‘ κ°μ²΄λ₯Ό μμ±νλ€.
μμ κ³Όμ μ κ±°μ³ ν΄λμ€μ μΈμ€ν΄μ€κ° μμ±λλλ° μ½λλ‘ ν λ² μ΄ν΄λ³΄μ
class Person {
constructor(name) {
// 1. λ΄λΆ μ½λ μ€ν μ μ, μ묡μ μΌλ‘ λΉ κ°μ²΄ μμ±
// μΈμ€ν΄μ€μ __proto__ -> ν΄λμ€.prototype
// μΈμ€ν΄μ€λ thisμ λ°μΈλ©
console.log(this); // Person {}
// 2. thisμ λ°μΈλ©λ μΈμ€ν΄μ€λ₯Ό μ΄κΈ°ν
this.name = name;
// 3. μμ±λ μΈμ€ν΄μ€κ° λ°μΈλ©λ thisλ₯Ό μ묡μ μΌλ‘ λ°ν
}
sayHi() {
console.log('Hi');
}
static sayHello() {
console.log('Hello');
}
}
const harry = new Person("Harry");
νλ‘ν νμ
체μΈμΌλ‘λ μ΄λ κ² μ°κ²°λλ€.
μ΄μ μ μμ±μ ν¨μλ₯Ό μ¬μ©ν΄ κ°μ²΄λ₯Ό λ§λ€μμ λμ ν¬κ² λ€λ₯΄μ§ μλ€.
μ₯ κ°μκΈ° νλ‘νΌν°λΌλ! λΌλ μκ°μ΄ λ€μκΈ°λ₯Ό λ°λλ€. μμμ ν΄λμ€ λͺΈμ²΄μμλ 0κ° μ΄μμ λ©μλλ§ μ μν μ μλ€κ³ νλλ° κ°μκΈ° νλ‘νΌν°κ° λμλ€λ©΄ κΈμ μ λλ‘ μ½μ μ¬λμ΄λΌλ©΄ λΉν©μ ν΄μΌνλ€.
μμ μ€λͺ
κ³Όλ λ€λ₯΄κ², constructorμμ μΈμ€ν΄μ€ νλ‘νΌν°λ₯Ό μΆκ°ν΄μ£Όλ κ²μΈμ ν΄λμ€ λͺΈμ²΄μμ νλ‘νΌν°λ₯Ό μ μν μ μλ λ°©λ²λ€μ΄ μκ²Όλ€. μ΄λ€μ λν΄μ μμ보μ.
λ¬Όλ‘ μκ³ μκ² μ§λ§, μ κ·Όμ νλ‘νΌν°λ μ체μ μΌλ‘ κ°([[Value]] λ΄λΆ μ¬λ‘―)μ κ°μ§ μκ³ λ€λ₯Έ λ°μ΄ν° νλ‘νΌν°μ κ°μ μ½κ±°λ μ μ₯ν λ μ¬μ©νλ μ κ·Όμ ν¨μ(accessor function)λ‘ κ΅¬μ±λ νλ‘νΌν°μ΄λ€.
class Person {
constructor(firstName, lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
// getter ν¨μ
get fullName() {
return `${this.firstName} ${this.lastName}`;
}
// setter ν¨μ
set fullName(name) {
[this.firstName, this.lastName] = name.split(' ');
}
// fullNameμ μ κ·Όμ νλ‘νΌν°λ€.
// get fullName(), set fullName(name)μ κ°κ° [[get]], [[set]]μ¬λ‘―μ λ°μΈλ©λ getter, setterν¨μμ΄λ€.
}
μ΄ λ, μ κ·Όμ νλ‘νΌν° ν€λ μΈμ€ν΄μ€ νλ‘νΌν°μ²λΌ μ¬μ©λλ€. μ κ·Όμ νλ‘νΌν° ν€λ₯Ό νλ‘νΌν°μ²λΌ μ°Έμ‘°νλ νμμΌλ‘ μ¬μ©νλ©°, μ°Έμ‘° μμ λ΄λΆμ μΌλ‘ [[get]](getter ν¨μ), [[set]](setter ν¨μ)κ° νΈμΆλλ€. ν΄λμ€μ λ©μλλ κΈ°λ³Έμ μΌλ‘ νλ‘ν νμ λ©μλκ° λλ€. λ°λΌμ ν΄λμ€μ μ κ·Όμ νλ‘νΌν° λν μΈμ€ν΄μ€ νλ‘νΌν°κ° μλ νλ‘ν νμ μ νλ‘νΌν°κ° λλ€.
ν΄λμ€ νλλ, ν΄λμ€ κΈ°λ° κ°μ²΄μ§ν₯ μΈμ΄μμ ν΄λμ€κ° μμ±ν μΈμ€ν΄μ€μ νλ‘νΌν°λ₯Ό λ§νλ€. ν΄λμ€ λͺΈμ²΄μ ν΄λμ€ νλλ₯Ό μ μν μ μλ ν΄λμ€ νλ μ μ(Class field definitions)μ μμ μμ§ ECMAScriptμ μ μ νμ€ μ¬μμ μλμ§λ§, μ΅μ λΈλΌμ°μ μ Node.jsμμλ ν΄λμ€ νλλ₯Ό ν΄λμ€ λͺΈμ²΄μ μ μν μ μλ€.
μλ μ½λλ₯Ό ν΅ν΄ ν΄λμ€ νλλ₯Ό μ΄λ»κ² ν΄λμ€ λͺΈμ²΄μ μ μνλμ§ λ³΄μ.
class Person {
// ν΄λμ€ νλμ λ¬Έμμ΄μ ν λΉ
name = 'Harry';
// ν΄λμ€ νλμ ν¨μλ₯Ό ν λΉ
getName = function () {
return this.name;
}
// νλ‘ν νμ
λ©μλ (ν¨μλ₯Ό ν λΉν ν΄λμ€ νλμ ν·κ°λ¦¬μ§ λ§μ)
itIsPrototypeMethod() {
return 'It is not Classfield';
}
}
const harry = new Person();
console.log(harry); // Person {name: "Harry", getName: f)
ν΄λμ€λ₯Ό μ μν λ '<νλ‘νΌν° μ΄λ¦> = <κ°>'μ μ¨μ£Όλ©΄ κ°λ¨ν ν΄λμ€ νλλ₯Ό λ§λ€ μ μλ€. μ μ½λμμλ ν΄λμ€ νλμ λ¬Έμμ΄κ³Ό ν¨μλ₯Ό ν λΉνλ€. κ·Έλ¬λ ν΄λμ€ νλμ ν¨μλ₯Ό ν λΉνλ©΄ ν΄λμ€ νλκ° μΈμ€ν΄μ€ νλ‘νΌν°κ° λκΈ° λλ¬Έμ ν΄λΉ ν¨μλ μΈμ€ν΄μ€ λ©μλκ° λλ―λ‘ ν΄λμ€ νλμ ν¨μλ₯Ό ν λΉνλ κ²μ κΆμ₯ νμ§ μλλ€.
class Person {
constructor(name) {
this.name = name;
}
}
κ·Έλ¬λ μΈμ€ν΄μ€λ₯Ό μμ±ν λ ν΄λμ€ νλλ₯Ό μΈλΆμ μ΄κΈ°κ°μΌλ‘ μ΄κΈ°νν νμκ° μλ€λ©΄ constructorμμ ν΄λμ€ νλλ₯Ό μ΄κΈ°νν΄μΌ νλ€.
μλ°μ€ν¬λ¦½νΈλ λ€λ₯Έ ν΄λμ€ κΈ°λ° κ°μ²΄μ§ν₯ μΈμ΄μμ μ§μνλ private, public, protected ν€μλμ κ°μ μ κ·Ό μ νμλ₯Ό μ§μνμ§ μλλ€. μ¦, ν΄λμ€ νλλ κΈ°λ³Έμ μΌλ‘ publicνκΈ° λλ¬Έμ μΈλΆμ κ·Έλλ‘ λ ΈμΆλλ€. νμ§λ§ private νλλ₯Ό μ μν μ μλ μλ‘μ΄ νμ€ μ¬μμ΄ μ μλμ΄μλ€. μ΄ μ μλ μ΅μ λΈλΌμ°μ μ Node.jsμ μ΄λ―Έ ꡬνλμ΄ μλ€.
μ΄λ»κ² private νλλ₯Ό μ μνλμ§ μ½λλ₯Ό ν΅ν΄ μ΄ν΄λ³΄μ
class Person {
// private νλλ λ°λμ constructorκ° μλ ν΄λμ€ λͺΈμ²΄μ μ μν΄μΌ νλ€.
#name = '';
constructor(name) {
// private νλ μ°Έμ‘°
this.#name = name;
}
const harry = new Person('Harry');
// private νλ #nameμ ν΄λμ€ μΈλΆμμ μ°Έμ‘°ν μ μλ€.
console.log(harry.#name);
μ κ·Ό κ°λ₯μ± | public | private |
---|---|---|
ν΄λμ€ λ΄λΆ | O | O |
μμ ν΄λμ€ λ΄λΆ | O | X |
ν΄λμ€ μΈμ€ν΄μ€λ₯Ό ν΅ν μ κ·Ό | O | X |
μ΄μ²λΌ ν΄λμ€ μΈλΆμμ private νλμ μ§μ μ κ·Όν μ μλ λ°©λ²μ μλ€. λ€λ§ μ κ·Όμ νλ‘νΌν°λ₯Ό ν΅ν΄ κ°μ μ μΌλ‘ μ κ·Όνλ λ°©λ²μ μ ν¨νλ€.
class Person {
#name = '';
constructor(name) {
this.#name = name;
}
get name() {
return this.#name;
}
}
const harry = new Person('Harry');
console.log(harry.name); // Harry
static public, static private νλ, static private λ©μλλ₯Ό μ μν μ μλ μλ‘μ΄ νμ€ μ¬μμΈ βStatic class featuresβκ° μ μλμ΄ μλ€. μ΄ μ μ μ€ static public/private νλλ μ΄λ―Έ μ΅μ λΈλΌμ°μ , Node.jsμ μ΄λ―Έ ꡬνλμ΄ μλ€.
class MyMath {
// static public νλ μ μ
static PI = 22 / 7;
// static private νλ μ μ
static #num = 10;
// static λ©μλ
static increment() {
return ++MyMath.#num;
}
}
console.log(math.PI); // undefined
console.log(math.increment); // undefined
console.log(MyMath.PI); // 3.142857142857143
console.log(MyMath.increment()); // 11
μ§κΈκΉμ§ μ°λ¦¬λ ν΄λμ€κ° λμ§, μ΄λ»κ² μ μνκ³ , λ΄λΆμ λ μ μν μ μλμ§, ν΄λμ€μ λͺ©μ μΈ κ°μ²΄(μΈμ€ν΄μ€) μμ±κΉμ§ μμλ΄€λ€. μ΄μ λ§μ§λ§μΌλ‘ ν΄λμ€μ μμμ μν νμ₯μ λν΄ μμ보λλ‘ νμ.
ν΄λμ€λ μ§κΈκΉμ§μ μμ±μ ν¨μ λ±μ λ€λ₯Έ κ°μ²΄ μμ± λ°©μκ³Ό λ€λ₯΄κ² "extends"λ₯Ό νμ©νμ¬, μμ ν΄λμ€λ₯Ό μμ λ°μ νμ ν΄λμ€λ₯Ό νμ₯ν μ μλ€. μ°λ¦¬λ μλμμ λμμμ λμ€λ superClass, subClassμ κ΄κ³μ λν΄ μ΄ν΄λ³Ό μμ μ΄λ€.
class Animal {}
class Bird extends Animal {}
const eagle = new Bird();
μ μ½λμμ Animal
μ΄ μμ ν΄λμ€μΈ superClassμ΄λ©°, Animal
μ μμλ°μ νμ₯λ Bird
κ° νμ ν΄λμ€μΈ subClassμ΄λ€. eagle
μ μ€λͺ
ν κ²λ μμ§λ§ instanceμ΄λ€.
"extends" ν€μλλ superClassμ subClassκ°μ μμ κ΄κ³λ₯Ό μ€μ νλ€. μ κ·Έλ¦Όμ 보면 νλ‘ν νμ
μ ν΅ν΄ subClassκ° superClassλ₯Ό μμλ°μλ€.
ν΄λμ€λ superClassμ subClassλ₯Ό ꡬλΆνκΈ° μν΄ [[ConstructorKind]]λΌλ λ΄λΆ μ¬λ‘―μ κ°λλ€. λ€λ₯Έ ν΄λμ€λ₯Ό μμλ°μ§ μλ ν΄λμ€λ [[ConstructorKind]]μ κ°μ΄ "base" μ΄κ³ , λ€λ₯Έ ν΄λμ€λ₯Ό μμλ°λ ν΄λμ€λ [[ConstructorKind]]μ κ°μ΄ "derived"μ΄λ€.
μλ°μ€ν¬λ¦½νΈμλ subClassμμ superClassλ₯Ό κ°λ¦¬ν€λ "super"λΌλ ν€μλκ° μ‘΄μ¬νλ€. subClassμ constructorμμλ super νΈμΆμ ν΅ν΄ superClassμ constructorλ₯Ό νΈμΆνλ©°, subClassμ λ©μλ λ΄μμλ super μ°Έμ‘°λ₯Ό ν΅ν΄ superClassμ λ©μλλ₯Ό νΈμΆν μ μλ€.
μμ κ΄κ³μ μλ λ ν΄λμ€κ° νλ ₯νλ©° μΈμ€ν΄μ€λ₯Ό μμ±νλ κ³Όμ μ μ’ λ 볡μ‘νλ€. μ΄μ λν΄ μμ보μ.
λ¨Όμ [[ConstructorKind]] κ°μ λ°λΌμ new μ°μ°μμ ν¨κ» νΈμΆλμμ λμ λμμ΄ κ΅¬λΆλλ€.
μνΌν΄λμ€ - μΈμ€ν΄μ€ μμ±κ³Ό this λ°μΈλ©, μΈμ€ν΄μ€ μ΄κΈ°ν λ° λ°ν
μλΈν΄λμ€ - super νΈμΆ, λ°νλ μΈμ€ν΄μ€ thisμ λ°μΈλ©, μΈμ€ν΄μ€ μ΄κΈ°ν λ° λ°ν
class Rectangle {
constructor(height, width) {
// 2.μνΌν΄λμ€μ μΈμ€ν΄μ€ μμ±κ³Ό this λ°μΈλ©
// 3.μνΌν΄λμ€μ μΈμ€ν΄μ€ μ΄κΈ°ν
this.height = height;
this.height = width;
// μΈμ€ν΄μ€ λ°ν (μλΈν΄λμ€λ μμ μ΄ μΈμ€ν΄μ€λ₯Ό μμ±νμ§ μκ³ λ°νλ μΈμ€ν΄μ€λ₯Ό μ¬μ©νλ€)
// κ·Έλ¬λ new.targetμ μλΈν΄λμ€λ₯Ό κ°λ¦¬ν¨λ€.
// μ¦, μΈμ€ν΄μ€λ μλΈν΄λμ€κ° μμ±ν κ²μΌλ‘ μ²λ¦¬λλ€.
}
getArea() {
return this.height * this.width;
}
}
class Square extends Rectangle {
constructor(width) {
// 1.μλΈν΄λμ€μ super νΈμΆ
super(width, width);
// 4.μλΈν΄λμ€ constructorλ‘μ 볡κ·μ this λ°μΈλ©
// 5.μλΈν΄λμ€μ μΈμ€ν΄μ€ μ΄κΈ°ν (ν΄λΉ μ½λμμλ μμ)
// 6.μΈμ€ν΄μ€ λ°ν
}
getArea() {
return this.width ** 2;
}
}
const square = new Square(4);
extends ν€μλ λ€μμλ ν΄λμ€λΏλ§μ΄ μλλΌ [[Construct]] λ΄λΆ λ©μλλ₯Ό κ°λ ν¨μ κ°μ²΄λ‘ νκ°λ μ μλ λͺ¨λ ννμμ μ¬μ©ν μ μλ€. μ΄λ₯Ό ν΅ν΄ λμ μΌλ‘ μμλ°μ λμμ κ²°μ ν μ μλ€.
function Base1() {}
class Base2 {}
let condition = true;
// 쑰건μ λ°λΌ λμ μΌλ‘ μμ λμμ κ²°μ νλ μλΈν΄λμ€
class Derived extends (condition ? Base1 : Base2) {}
const derived - new Derived();
console.log(derived instanceof Base1); // true
console.log(derived instanceof Base2); // false