ν°μ€ν 리 λ·°
[JavaScript] ν΄λμ€
κ°λ°κ°κ΅΄πΈ 2022. 7. 28. 19:37λ±μ₯ λ°°κ²½
μλ°μ€ν¬λ¦½νΈλ νλ‘ν νμ κΈ°λ° κ°μ²΄μ§ν₯ μΈμ΄λ‘ ν΄λμ€κ° νμ μλ κ°μ²΄μ§ν₯ νλ‘κ·Έλλ° μΈμ΄μ λλ€.
νμ§λ§ ν΄λμ€ κΈ°λ° μΈμ΄μ μ΅μν νλ‘κ·Έλλ¨Έλ€μ νλ‘ν νμ κΈ°λ° νλ‘κ·Έλλ° λ°©μμ νΌλμ λλ μ μμΌλ©° μλ°μ€ν¬λ¦½νΈλ₯Ό μ΄λ ΅κ² λλΌκ² νλ νλμ μ₯λ²½μ²λΌ μΈμλμμ΅λλ€.
λ°λΌμ ES6μμ λμ λ ν΄λμ€λ κΈ°μ‘΄ νλ‘ν νμ κΈ°λ° κ°μ²΄μ§ν₯ νλ‘κ·Έλλ°λ³΄λ€ ν΄λμ€ κΈ°λ° κ°μ²΄μ§ν₯ νλ‘κ·Έλλ° μΈμ΄μ λ§€μ° ν‘μ¬ν μλ‘μ΄ κ°μ²΄ μμ± λ©μ»€λμ¦μ μ μνμμ΅λλ€.
μ¬μ€ ν΄λμ€λ ν¨μμ΄λ©° κΈ°μ‘΄ νλ‘ν νμ κΈ°λ° ν¨ν΄μ ν΄λμ€ κΈ°λ° ν¨ν΄μ²λΌ μ¬μ©ν μ μλλ‘ νλ λ¬Έλ²μ μ€νμ΄λΌκ³ λ³Ό μ μμ΅λλ€. νμ§λ§, μμ±μ ν¨μμ λ§€μ° μ μ¬νκ² λμνλ λ°λ©΄ λͺ κ°μ§ μ°¨μ΄μ μ΄ μμ΄ μλ‘μ΄ κ°μ²΄ μμ± λ©μ»€λμ¦μΌλ‘ 보λ κ²μ΄ μ’ λ ν©λΉν©λλ€.
ν΄λμ€ | μμ±μ ν¨μ |
new μ°μ°μ μμ΄ νΈμΆνλ©΄ μλ¬κ° λ¨ | new μ°μ°μ μμ΄ νΈμΆνλ©΄ μΌλ° ν¨μλ‘μ νΈμΆλ¨ |
μμμ μ§μνλ extendsμ super ν€μλλ₯Ό μ 곡 | extendsμ super ν€μλλ₯Ό μ 곡 X |
νΈμ΄μ€ν μ΄ λ°μνμ§ μλ κ²μ²λΌ λμ | ν¨μ μ μΈλ¬Έ/ν¨μ ννμμΌλ‘ μ μνλ©΄ νΈμ΄μ€ν λ°μ |
μ묡μ μΌλ‘ strict modeκ° μ§μ λ¨(ν΄μ λΆκ°λ₯) | μ묡μ μΌλ‘ strict mode μ§μ X |
constructor, νλ‘ν νμ λ©μλ, μ μ λ©μλλ μ΄κ±° X | μ΄κ±° κ°λ₯ |
μ΄μ²λΌ ν΄λμ€λ μμ±μ ν¨μ κΈ°λ°μ κ°μ²΄ μμ± λ°©μλ³΄λ€ κ²¬κ³ νκ³ λͺ λ£ν©λλ€. νΉν extendsμ super ν€μλλ μμ κ΄κ³ ꡬνμ λμ± κ°κ²°νκ³ λͺ λ£νκ² ν©λλ€.
ν΄λμ€ μ μ
ν΄λμ€λ class ν€μλλ₯Ό ν΅ν΄ μ μν©λλ€.
// ν΄λμ€ μ μΈλ¬Έ
class Person {};
// μ΅λͺ
ν΄λμ€ ννμ
const Person = class {};
// κΈ°λͺ
ν΄λμ€ ννμ
const Person = class MyClass {};
μΌλ°μ μ΄μ§λ μμ§λ§ ν¨μμ λ§μ°¬κ°μ§λ‘ ννμμΌλ‘ ν΄λμ€λ₯Ό μ μν μλ μμ΅λλ€. μ¦, ν΄λμ€κ° κ°μΌλ‘ μ¬μ©ν μ μλ *μΌκΈ κ°μ²΄λΌλ κ²μ μλ―Ένκ³ μ΄λ₯Ό ν΅ν΄ ν΄λμ€λ ν¨μμΈ κ²μ μ μ μμ΅λλ€.
*μΌκΈ κ°μ²΄μ μλ―Έμ νΉμ§μ μκ³ μΆλ€λ©΄ μλμ ν¬μ€ν μ μ°Έκ³ νμΈμ.
https://j-su2.tistory.com/68?category=1037205
ν΄λμ€ λͺΈμ²΄μλ 0κ° μ΄μμ λ©μλλ§ μ μν μ μκ³ , μ μν μ μλ λ©μλλ constructor(μμ±μ), νλ‘ν νμ λ©μλ, μ μ λ©μλ 3κ°μ§κ° μμ΅λλ€.
// ν΄λμ€ μ μΈλ¬Έ
class Person {
// μμ±μ
constructor(name) {
// μΈμ€ν΄μ€ μμ± λ° μ΄κΈ°ν
this.name = name; // name νλ‘νΌν°λ public
}
// νλ‘ν νμ
λ©μλ
sayHi() {
console.log(`Hi! My name is ${this.name}`);
}
// μ μ λ©μλ
static sayHello() {
console.log('Hello!');
}
}
// μΈμ€ν΄μ€ μμ±
const me = new Person('Lee');
// μΈμ€ν΄μ€ νλ‘νΌν° μ°Έμ‘°
console.log(me.name); // Lee
// νλ‘ν νμ
λ©μλ νΈμΆ
me.sayHi(); // Hi! My name is Lee
// μ μ λ©μλ νΈμΆ
Person.sayHello(); // Hello!
μ΄μ²λΌ ν΄λμ€μ μμ±μ ν¨μμ μ μ λ°©μμ ννμ μΈ λ©΄μμ λ§€μ° μ μ¬ν©λλ€.
ν΄λμ€ νΈμ΄μ€ν
ν΄λμ€λ ν¨μλ‘ νκ°λκΈ° λλ¬Έμ ν΄λμ€ μ μΈλ¬ΈμΌλ‘ μ μν ν΄λμ€λ ν¨μ μ μΈλ¬Έκ³Ό κ°μ΄ μμ€μ½λ νκ° κ³Όμ , μ¦ λ°νμ μ΄μ μ λ¨Όμ νκ°λμ΄ ν¨μ κ°μ²΄λ₯Ό μμ±ν©λλ€. μ΄λ constructor ν¨μκ° μμ±λκ³ νλ‘ν νμ λ λλΆμ΄ μμ±λ©λλ€.
console.log(Person); // ReferenceError
class Person();
λ¨, ν΄λμ€λ let, const ν€μλλ‘ μ μΈν λ³μμ²λΌ νΈμ΄μ€ν λμ΄ *μΌμμ μ¬κ°μ§λμ λΉ μ§κΈ° λλ¬Έμ νΈμ΄μ€ν μ΄ λ°μνμ§ μλ κ²μ²λΌ λμν©λλ€. λ°λΌμ ν΄λμ€λ ν΄λμ€ μ μ μ΄μ μ μ°Έμ‘°ν μ μμ΅λλ€.
*μΌμμ μ¬κ°μ§λ(DTZ) : μ€μ½νμ μμ μ§μ λΆν° μ΄κΈ°ν μ§μ κΉμ§ λ³μλ₯Ό μ°Έμ‘°ν μ μλ ꡬκ°
μΈμ€ν΄μ€ μμ±
ν΄λμ€λ μΈμ€ν΄μ€λ₯Ό μμ±νλ κ²μ΄ μ μΌν μ‘΄μ¬ μ΄μ μ΄λ―λ‘ λ°λμ new μ°μ°μμ ν¨κ» νΈμΆλμ΄ μΈμ€ν΄μ€λ₯Ό μμ±ν©λλ€.
class Person1 {};
const me = Person1(); // TypeError
λ©μλ
ν΄λμ€ λͺΈμ²΄μμ μ μν μ μλ λ©μλλ constructor(μμ±μ), νλ‘ν νμ λ©μλ, μ μ λ©μλ 3κ°μ§ μ λλ€.
constructor
constructorλ μΈμ€ν΄μ€λ₯Ό μμ±νκ³ μ΄κΈ°ννκΈ° μν νΉμν λ©μλλ‘ μ΄λ¦μ λ³κ²½ν μ μμ΅λλ€.
class Person {
// μμ±μ
constructor(name) {
// μΈμ€ν΄μ€ μμ± λ° μ΄κΈ°ν
this.name = name;
}
}
ν΄λμ€λ μΈμ€ν΄μ€λ₯Ό μμ±νκΈ° μν μμ±μ ν¨μλ‘ ν¨μ κ°μ²΄ κ³ μ νλ‘νΌν°λ₯Ό λͺ¨λ κ°κ³ μμ΅λλ€. ν¨μμ λμΌνκ² νλ‘ν νμ κ³Ό μ°κ²°λμ΄ μμΌλ©° μμ μ μ€μ½ν체μΈμ ꡬμ±ν©λλ€.
λν, μμ±μ ν¨μμ λ§μ°¬κ°μ§λ‘ constructor λ΄λΆμμ thisμ μΆκ°ν νλ‘νΌν°λ μΈμ€ν΄μ€ νλ‘νΌν°κ° λ©λλ€.
constructorλ λ€μκ³Ό κ°μ νΉμ§μ΄ μμ΅λλ€.
- constructorλ ν΄λμ€ λ΄μ μ΅λ ν κ°λ§ μ‘΄μ¬ν μ μμ
- constructorλ μλ΅ν μ μμ (μΈμ€ν΄μ€λ₯Ό μ΄κΈ°ννλ €λ©΄ constructor μλ΅ λΆκ°λ₯)
- constructorλ₯Ό μλ΅νλ©΄ ν΄λμ€μ λΉ constructorκ° μ묡μ μΌλ‘ μ μλ¨
- constructorλ λ³λμ λ°νλ¬Έμ κ°μ§ μμμΌ ν¨ (return λ¬Έ μλ΅)
νλ‘ν νμ λ©μλ
ν΄λμ€ λͺΈμ²΄μμ μ μν λ©μλλ ν΄λμ€μ prototype νλ‘νΌν°μ λ©μλλ₯Ό μΆκ°νμ§ μμλ κΈ°λ³Έμ μΌλ‘ νλ‘ν νμ λ©μλκ° λ©λλ€. (μμ±μ ν¨μλ₯Ό μ¬μ©νλ©΄ λͺ μμ μΌλ‘ νλ‘ν¬νμ μ λ©μλλ₯Ό μΆκ°ν΄μΌ ν¨)
class Person {
// μμ±μ
constructor(name) {
// μΈμ€ν΄μ€ μμ± λ° μ΄κΈ°ν
this.name = name;
}
// νλ‘ν¬νμ
λ©μλ
sayHi() {
console.log(`Hi! My name is ${this.name}`);
}
}
const me = new Person('Lee');
me.sayHi(); // Hi! My name is Lee
// me κ°μ²΄μ νλ‘ν νμ
μ Person.prototype
Object.getPrototypeOf(me) === Person.prototype; //true
me instanceof Person; // true
// Person.prototypeμ νλ‘ν νμ
μ Object.prototype
Object.getPrototypeOf(Person.prototype) === Object.prototype; //true
me instanceof Object; // true
// me κ°μ²΄μ constructorλ Person ν΄λμ€
me.constructor === Person; // true
λ°λΌμ μΈμ€ν΄μ€λ νλ‘ν¬νμ λ©μλλ₯Ό μμλ°μ μ¬μ©ν μ μκ³ μμ±μ ν¨μμ λ§μ°¬κ°μ§λ‘ ν΄λμ€κ° μμ±ν μΈμ€ν΄μ€λ νλ‘ν¬νμ 체μΈμ μΌμμ΄ λ©λλ€.
μ΄μ²λΌ νλ‘ν νμ 체μΈμ κΈ°μ‘΄μ λͺ¨λ κ°μ²΄ μμ± λ°©μλΏλ§ μλλΌ ν΄λμ€μ μν΄ μμ±λ μΈμ€ν΄μ€μλ λμΌνκ² μ μ©λ©λλ€. κ²°κ΅ ν΄λμ€λ μμ±μ ν¨μμ κ°μ΄ μΈμ€ν΄μ€λ₯Ό μμ±νλ μμ±μ ν¨μμ΄κ³ νλ‘ν νμ κΈ°λ°μ κ°μ²΄ μμ± λ©μ»€λμ¦μ λλ€.
μ μ λ©μλ
μ μ λ©μλλ μΈμ€ν΄μ€λ₯Ό μμ±νμ§ μμλ νΈμΆν μ μλ λ©μλλ₯Ό λ§ν©λλ€. ν΄λμ€μμλ λ©μλμ static ν€μλλ₯Ό λΆμ΄λ©΄ μ μ λ©μλκ° λ©λλ€. ( μμ±μ ν¨μλ λͺ μμ μΌλ‘ λ©μλλ₯Ό μΆκ°ν΄μΌ ν¨)
class Person {
// μμ±μ
constructor(name) {
// μΈμ€ν΄μ€ μμ± λ° μ΄κΈ°ν
this.name = name;
}
// νλ‘ν¬νμ
λ©μλ
static sayHi() {
console.log('Hi!');
}
}
Person.sayHi(); // Hi!
// μΈμ€ν΄μ€ μμ±
const me = new Person('Lee');
me.sayHi(); // TypeError
μ μμ μ Person ν΄λμ€λ λ€μκ³Ό κ°μ΄ νλ‘ν νμ 체μΈμ μμ±ν©λλ€.
μ΄μ²λΌ μ μ λ©μλλ ν΄λμ€μ λ°μΈλ©λ λ©μλκ° λκΈ° λλ¬Έμ μΈμ€ν΄μ€μ νλ‘ν νμ 체μΈμμ μ‘΄μ¬νμ§ μμ΅λλ€. λ°λΌμ μ μ λ©μλλ μΈμ€ν΄μ€λ‘ νΈμΆν μ μμ΅λλ€.
μ μ λ©μλ vs νλ‘ν νμ λ©μλ
- μ μ λ©μλμ νλ‘ν νμ λ©μλλ μμ μ΄ μν΄ μλ νλ‘ν νμ 체μΈμ΄ λ€λ¦
- μ μ λ©μλλ ν΄λμ€λ‘ νΈμΆνκ³ νλ‘ν νμ λ©μλλ μΈμ€ν΄μ€λ‘ νΈμΆ
- μ μ λ©μλλ μΈμ€ν΄μ€ νλ‘νΌν° μ°Έμ‘°X, νλ‘ν νμ λ©μλλ μΈμ€ν΄μ€ νλ‘νΌν° μ°Έμ‘°O
ν΄λμ€μμ μ μν λ©μλμ νΉμ§
- function ν€μλλ₯Ό μλ΅ν λ©μλ μΆμ½ ννμ μ¬μ©ν¨
- κ°μ²΄ 리ν°λ΄κ³Όλ λ€λ₯΄κ² ν΄λμ€μ λ©μλλ₯Ό μ μν λλ μ½€λ§κ° νμ μμ
- μ묡μ μΌλ‘ strict modeλ‘ μ€νλ¨
- for ... in λ¬Έμ΄λ Object.keys λ©μλ λ±μΌλ‘ μ΄κ±°ν μ μμ ([[Enumerable]] μ falseμ)
- λ΄λΆ λ©μλ [[Construct]]λ₯Ό κ°μ§ μλ non-constructorμ΄κΈ° λλ¬Έμ new μ°μ°μμ νΈμΆμ΄ λΆκ°λ₯
ν΄λμ€μ μΈμ€ν΄μ€ μμ± κ³Όμ
new μ°μ°μμ ν¨κ» ν΄λμ€λ₯Ό νΈμΆνλ©΄ ν΄λμ€μ λ΄λΆ λ©μλ [[Construct]]κ° νΈμΆλμ΄ λ€μκ³Ό κ°μ κ³Όμ μ κ±°μ³ μΈμ€ν΄μ€κ° μμ±λ©λλ€.
class Person {
// μμ±μ
constructor(name) {
// 1. μ묡μ μΌλ‘ μΈμ€ν΄μ€κ° μμ±λκ³ thisμ λ°μΈλ©
console.log(this); // Person {}
console.log(Object.getPrototypeOf(this) === Person.prototype); // true
// 2. thisμ λ°μΈλ©λμ΄ μλ μΈμ€ν΄μ€λ₯Ό μ΄κΈ°ν
this.name = name;
}
// 3. μμ±λ μΈμ€ν΄μ€κ° λ°μΈλ©λ thisκ° μ묡μ κΈλ‘ λ°νλ¨
}
1. μΈμ€ν΄μ€ μμ±κ³Ό this λ°μΈλ©
- new μ°μ°μμ ν¨κ» ν΄λμ€λ₯Ό νΈμΆνλ©΄ constructor λ΄λΆ μ½λκ° μ€νλκΈ°μ μμ μ묡μ μΌλ‘ λΉ κ°μ²΄κ° μμ±λ¨
- ν΄λμ€κ° μμ±ν μΈμ€ν΄μ€μ νλ‘ν νμ μΌλ‘ ν΄λμ€μ prototype νλ‘νΌν°κ° κ°λ¦¬ν€λ κ°μ²΄κ° μ€μ λ¨
- λΉ κ°μ²΄(μΈμ€ν΄μ€)λ thisμ λ°μΈλ©λμ΄ constructor λ΄λΆμ thisλ ν΄λμ€κ° μμ±ν μΈμ€ν΄μ€λ₯Ό κ°λ¦¬ν΄
2. μΈμ€ν΄μ€ μ΄κΈ°ν
- constructor λ΄λΆ μ½λκ° μ€νλμ΄ thisμ λ°μΈλ© λμ΄μλ μΈμ€ν΄μ€λ₯Ό μ΄κΈ°ν
- thisμ λ°μΈλ© λμ΄ μλ μΈμ€ν΄μ€μ νλ‘νΌν°λ₯Ό μΆκ°
- constructorκ° μΈμλ‘ μ λ¬λ°μ μ΄κΈ°κ°μΌλ‘ μΈμ€ν΄μ€μ νλ‘νΌν° κ°μ μ΄κΈ°ν
- λ§μ½ constructorκ° μλ΅λμλ€λ©΄ μ΄ κ³Όμ μ μλ΅λ¨
3. μΈμ€ν΄μ€ λ°ν
- ν΄λμ€μ λͺ¨λ μ²λ¦¬κ° λλλ©΄ μμ±λ μΈμ€ν΄μ€κ° λ°μΈλ©λ thisλ₯Ό μ묡μ μΌλ‘ λ°ν
νλ‘νΌν°
μΈμ€ν΄μ€ νλ‘νΌν°
constructor λ΄λΆμ μ μλ νλ‘νΌν°λ‘ μΈμ€ν΄μ€ νλ‘νΌν°λ μΈμ λ publicν©λλ€.
μ κ·Όμ νλ‘νΌν°
μ체μ μΌλ‘λ κ°μ κ°μ§ μκ³ λ€λ₯Έ λ°μ΄ν° νλ‘νΌν°μ κ°μ μ½κ±°λ μ μ₯ν λ μ¬μ©νλ μ κ·Όμ ν¨μλ‘ κ΅¬μ±λ νλ‘νΌν°λ‘ getter ν¨μμ setterν¨μλ‘ κ΅¬μ±λμ΄ μμ΅λλ€.
- getter : μΈμ€ν΄μ€ νλ‘νΌν°μ μ κ·Όν λλ§λ€ νλ‘νΌν° κ°μ μ‘°μνκ±°λ λ³λμ νμκ° νμν λ μ¬μ©
- setter : μΈμ€ν΄μ€ νλ‘νΌν°μ κ°μ ν λΉν λλ§λ€ νλ‘νΌν° κ°μ μ‘°μνκ±°λ λ³λμ νμκ° νμν λ μ¬μ©
class Person {
constructor(firstName, lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
// fullNameμ μ κ·Όμ ν¨μλ‘ κ΅¬μ±λ μ κ·Όμ νλ‘νΌν°
// getter ν¨μ
get fullName() {
return `${this.firstName} ${this.lastName}`;
}
// setter ν¨μ
set fullName(name) {
[this.firstName, this.lastName] = name.spilt(' ');
}
}
const me = new Person('Ungmo', 'Lee');
// setter ν¨μκ° νΈμΆ
me.fullName = 'Heegun Lee';
// getter ν¨μκ° νΈμΆ
console.log(me.fullName); // Heegun Lee
ν΄λμ€ νλ μ μ μ μ
ν΄λμ€ νλλ ν΄λμ€ κΈ°λ° κ°μ²΄μ§ν₯ μΈμ΄μμ ν΄λμ€κ° μμ±ν μΈμ€ν΄μ€μ νλ‘νΌν°λ₯Ό κ°λ¦¬ν€λ μ©μ΄μ λλ€.
μλ° κ°μ ν΄λμ€ κΈ°λ° μΈμ΄μμ ν΄λμ€ νλλ λ§μΉ ν΄λμ€ λ΄λΆμμ λ³μμ²λΌ μ¬μ©ν μ μμ§λ§, μλ°μ€ν¬λ¦½νΈμ ν΄λμ€ λͺΈμ²΄μλ λ©μλλ§ μ μΈν μ μκΈ° λλ¬Έμ λ°λμ constructorλ΄λΆμμ thisλ₯Ό μ¬μ©ν΄ ν΄λμ€ νλλ₯Ό μ΄κΈ°νν΄μΌν©λλ€.
class Person {
// ν΄λμ€ νλ μ΄κΈ°ν
constructor(name) {
this.name = name;
}
}
const me = new Person('Lee');
console.log(me); // Person {name: "Lee"}
ν¨μλ μΌκΈ κ°μ²΄μ΄λ―λ‘ ν¨μλ₯Ό ν΄λμ€ νλμ ν λΉν μ μμ΅λλ€. λ°λΌμ ν΄λμ€ νλλ₯Ό ν΅ν΄ λ©μλλ₯Ό μ μν μλ μμ§λ§ μ΄ ν¨μλ νλ‘ν¬νμ λ©μλκ° μλ μΈμ€ν΄μ€ λ©μλκ° λκΈ° λλ¬Έμ κΆμ₯λμ§ μμ΅λλ€.
**μ΅μ Node.js(v.12)μμ μλ°μ μ μ¬νκ² ν΄λμ€ νμ€λ₯Ό μ μΈν μ μμ§λ§ μμ§ ECMAScript μ μ νμ€ μ¬μμ΄ μλ
private νλ μ μ μ μ
μλ°μ€ν¬λ¦½νΈλ μΊ‘μνλ₯Ό μμ νκ² μ§μνμ§ μκΈ° λλ¬Έμ ν΄λμ€ νλ μ μ μ μμ μ¬μ©νλλΌλ ν΄λμ€ νλλ κΈ°λ³Έμ μΌλ‘ publicνκΈ° λλ¬Έμ μΈλΆμ κ·Έλλ‘ λ ΈμΆλμμ΅λλ€.
νμ§λ§, TC39 νλ‘νμ€μ stage 3μ private νλλ₯Ό μ μν μ μλ μλ‘μ΄ νμ€ μ¬μμ΄ μ μλμμ΅λλ€.
class Person {
//private νλ μ μ
#name = '';
constructor(name) {
this.#name = name;
}
get name() {
// private νλλ₯Ό μ°Έμ‘°νλ©° trimν λ€μ λ°ν
return this.#name.trim();
}
}
const me = new Person(' Lee ');
// private νλλ ν΄λμ€ μΈλΆμμ μ°Έμ‘° X
console.log(me.#name); // SyntaxError
console.log(me.name); // Lee
- private νλμ μ λμλ #μ λΆμ¬μ£Όκ³ private νλλ₯Ό μ°Έμ‘°ν λλ #μ λΆμ¬μ£Όμ΄μΌ ν¨
- private νλλ ν΄λμ€ λ΄λΆμμλ§ μ°Έμ‘° κ°λ₯
(public νλλ ν΄λμ€ λ΄λΆ, μμ ν΄λμ€ λ΄λΆ, ν΄λμ€ μΈμ€ν΄μ€λ₯Ό ν΅ν μ κ·Ό λ± μ΄λμλ μ°Έμ‘° κ°λ₯) - private νλλ λ°λμ ν΄λμ€ λͺΈμ²΄μ μ μν΄μΌ ν¨ (μ§μ constructorμ μ μνλ©΄ μλ¬)
- μ κ·Όμ νλ‘νΌν°λ₯Ό ν΅ν΄ κ°μ μ μΌλ‘ μ κ·Όνλ λ°©λ²μ μ ν¨ν¨
static νλ μ μ μ μ
ν΄λμ€μμ static ν€μλλ₯Ό μ΄μ©νλ©΄ μ μ λ©μλλ₯Ό μ μν μ μμ§λ§, static ν€μλλ₯Ό μ¬μ©νμ¬ μ μ νλλ₯Ό μ μν μλ μμμ΅λλ€.
νμ§λ§, TC39 νλ‘νμ€μ stage 3μ static public νλ, static private νλ, static private λ©μλλ₯Ό μ μν μ μλ μλ‘μ΄ νμ€ μ¬μμΈ "Static class features"κ° μ μλμμ΅λλ€.
class MyMath {
// static public νλ μ μ
static PI = 22 / 7;
// static private νλ μ μ
static #num = 10;
// static λ©μλ
static increment() {
return ++MyMath.#num;
}
}
console.log(MyMath.PI); // 3.142857...
console.log(MyMath.increment()); // 11
μμμ μν ν΄λμ€ νμ₯
νλ‘ν νμ κΈ°λ° μμμ νλ‘ν νμ 체μΈμ ν΅ν΄ λ€λ₯Έ κ°μ²΄μ μμ°μ μμλ°λ κ°λ μ΄μ§λ§, μμμ μν ν΄λμ€ νμ₯μ κΈ°μ‘΄ ν΄λμ€λ₯Ό μμλ°μ μλ‘μ΄ ν΄λμ€λ₯Ό νμ₯νμ¬ μ μνλ κ²μ λλ€.
ν΄λμ€ μμκ³Ό μμ±μ ν¨μ μμ
ν΄λμ€λ μμμ ν΅ν΄ κΈ°μ‘΄ ν΄λμ€λ₯Ό νμ₯ν μ μλ λ¬Έλ²μ΄ κΈ°λ³Έμ μΌλ‘ μ 곡λμ§λ§ μμ±μ ν¨μλ κ·Έλ μ§ μμ΅λλ€. μ¦, ν΄λμ€λ extends ν€μλκ° κΈ°λ³Έμ μΌλ‘ μ 곡λμ΄ ν΄λμ€ νμ₯μ΄ κ°νΈνκ³ μ§κ΄μ μ λλ€.
extends ν€μλ
μμμ ν΅ν΄ ν΄λμ€λ₯Ό νμ₯νλ €λ©΄ extends ν€μλλ₯Ό μ¬μ©νμ¬ μμλ°μ ν΄λμ€λ₯Ό μ μνλλ°, extends ν€μλμ μν μ μνΌν΄λμ€μ μλΈν΄λμ€ κ°μ μμ κ΄κ³λ₯Ό μ€μ νλ κ²μ λλ€.
// μνΌ(λ² μ΄μ€/λΆλͺ¨)ν΄λμ€
class Base {};
// μλΈ(νμ/μμ) ν΄λμ€
class Derived extends Base {}
- μλΈ ν΄λμ€ : μμμ ν΅ν΄ νμ₯λ ν΄λμ€
- μνΌ ν΄λμ€ : μλΈν΄λμ€μκ² μμλ ν΄λμ€
ν΄λμ€λ νλ‘ν νμ μ ν΅ν΄ μμ κ΄κ³λ₯Ό ꡬννλλ°, μνΌ ν΄λμ€μ μλΈν΄λμ€λ μΈμ€ν΄μ€μ νλ‘ν νμ 체μΈλΏ μλλΌ ν΄λμ€ κ°μ νλ‘ν νμ 체μΈλ μμ±νκΈ° λλ¬Έμ νλ‘ν νμ λ©μλ, μ μ λ©μλ λͺ¨λ μμμ΄ κ°λ₯ν©λλ€.
λμ μμ
extends ν€μλλ ν΄λμ€λΏλ§ μλλΌ μμ±μ ν¨μλ₯Ό μμλ°μ ν΄λμ€λ₯Ό νμ₯ν μλ μμ΅λλ€. λ¨, extends ν€μλ μμλ λ°λμ ν΄λμ€κ° μμΌν©λλ€.
// μμ±μ ν¨μ
function Base(a) {
this.a = a;
}
// μμ±μ ν¨μλ₯Ό μμλ°λ μλΈν΄λμ€
class Derived extends Base {}
const derived = new Derived(1);
console.log(derived); // Derived {a: 1}
νμ§λ§, extends ν€μλ λ€μμλ ν΄λμ€λΏλ§ μλλΌ [[Contruct]] λ΄λΆ λ©μλλ₯Ό κ°λ ν¨μ κ°μ²΄λ‘ νκ°λ μ μλ λͺ¨λ ννμμ μ¬μ©ν μ μμ΅λλ€. μ΄λ₯Ό ν΅ν΄ λμ μΌλ‘ μμλ°μ λμμ κ²°μ ν μ μμ΅λλ€.
function Base1() {}
class Base2() {}
let condition = true;
// 쑰건μ λ°λΌ λμ μΌλ‘ μμ λμμ κ²°μ νλ μλΈν΄λμ€
class Derived extends (condition ? Base1 : Base2) {}
const derived = new Derived();
console.log(derived); // Derived {}
console.log(derived instanceof Base1); // true
console.log(derived instanceof Base2); // false
μλΈν΄λμ€μ constructor
μλΈν΄λμ€μμ constructorλ₯Ό μλ΅νλ©΄ ν΄λμ€μ λ€μκ³Ό κ°μ constructorκ° μ묡μ μΌλ‘ μ μλ©λλ€.
constructor(...args) { super(...args); }
μ΄λ, argsλ new μ°μ°μμ ν¨κ» ν΄λμ€λ₯Ό νΈμΆν λ μ λ¬ν μΈμ 리μ€ν¬μ΄κ³ super()λ μνΌν΄λμ€μ constructorλ₯Ό νΈμΆνμ¬ μΈμ€ν΄μ€λ₯Ό μμ±ν©λλ€.
super ν€μλ
super ν€μλλ ν¨μμ²λΌ νΈμΆν μλ μκ³ thisμ κ°μ΄ μλ³μμ²λΌ μ°Έμ‘°ν μ μλ νΉμν ν€μλμ λλ€.
- superμ νΈμΆ : μνΌν΄λμ€μ constructorλ₯Ό νΈμΆ
- μλΈν΄λμ€μμ constructorλ₯Ό μλ΅νμ§ μλ κ²½μ° μλΈν΄λμ€μ constructorμμλ λ°λμ superλ₯Ό νΈμΆν΄μΌ ν¨
- μλΈν΄λμ€μ constructorμμ superλ₯Ό νΈμΆνκΈ° μ μλ thisλ₯Ό μ°Έμ‘°ν μ μμ
- superμ λ°λμ μλΈν΄λμ€μ constructorμμλ§ νΈμΆ κ°λ₯
class Base {
constructor(a, b) {
this.a = a;
this.b = b;
}
}
class Derived extends Base {
constructor(a, b, c) {
super(a, b);
this.c = c;
}
}
const derived = new Derived(1,2,3);
console.log(derived); // Derived {a:1, b:2, c:3}
- superμ μ°Έμ‘° : μνΌν΄λμ€μ λ©μλλ₯Ό νΈμΆν μ μμ
- μλΈν΄λμ€μ νλ‘ν νμ λ©μλ λ΄μμ super.sayHiλ μνΌν΄λμ€μ νλ‘ν νμ λ©μλ sayHiλ₯Ό κ°λ₯΄ν΄
- μλΈν΄λμ€μ μ μ λ©μλ λ΄μμ super.sayHelloλ μνΌν΄λμ€μ μ μ λ©μλ sayHelloλ₯Ό κ°λ¦¬ν΄
class Base {
constructor(name) {
this.name = name;
}
sayHi() {
return `Hi! ${this.name}`;
}
static sayHello() {
return `Hello!`;
}
}
class Derived extends Base {
sayHi() {
return `${super.sayHi()}. how are you doing?`;
}
static sayHello() {
return `${super.sayHello()} how are you doing?`;
}
}
const derived = new Derived('Lee');
console.log(derived.sayHi()); // Hi! Lee. how are you doing?
console.log(Derived.sayHi()); // Hello! how are you doing?
μμ ν΄λμ€μ μΈμ€ν΄μ€ μμ± κ³Όμ
μ§μ¬κ°νμ μΆμνν Rectagle ν΄λμ€μ μμμ ν΅ν΄ νμ₯ν ColorRectangle ν΄λμ€λ₯Ό μ μνλ κ³Όμ μ λ€μκ³Ό κ°μ΅λλ€.
// μνΌν΄λμ€
class Rectangle {
constructor(width, height) {
this.width = width;
this.height = height;
}
getArea() {
return this.width * this.height;
}
toString() {
return `width = ${this.width}, height = ${this.height}`;
}
}
// μλΈν΄λμ€
class ColorRectangle extends Rectangle {
constructor(width, height, color) {
super(width, height);
this.color = color;
}
// λ©μλ μ€λ²λΌμ΄λ©
toString() {
return super.toString() + `, color = ${this.color}`;
}
}
const colorRectangle = new ColorRectangle(2, 4, 'red');
console.log(colorRectangle); // ColorRectangle {width: 2, height: 4, color: "red"}
// μμμ ν΅ν΄ getArea λ©μλλ₯Ό νΈμΆ
console.log(colorRectangle.getArea()); // 8
// μ€λ²λΌμ΄λ©λ toString λ©μλλ₯Ό νΈμΆ
console.log(colorRectangle.toString()); // width = 2, height = 4, color = red
1. μλΈν΄λμ€μ super νΈμΆ
- μλΈν΄λμ€λ μμ μ΄ μ§μ μΈμ€ν΄μ€λ₯Ό μμ±νμ§ μκ³ μνΌν΄λμ€μκ² μΈμ€ν΄μ€ μμ±μ μμ
2. μνΌν΄λμ€μ μΈμ€ν΄μ€ μμ±κ³Ό this λ°μΈλ©
- μνΌν΄λμ€κ° μ묡μ μΌλ‘ μμ±ν λΉ κ°μ²΄(μΈμ€ν΄μ€)κ° μμ±λκ³ thisμ λ°μΈλ©λ¨
- new μ°μ°μμ ν¨κ» νΈμΆλ ν¨μ(μΈμ€ν΄μ€)λ new.targetμ΄ κ°λ¦¬ν€λ μλΈν΄λμ€κ° μμ±ν κ²μΌλ‘ μ²λ¦¬λ¨
3. μνΌν΄λμ€μ μΈμ€ν΄μ€ μ΄κΈ°ν
- μνΌν΄λμ€μ constructorκ° μ€νλμ΄ thisμ λ°μΈλ©λμ΄ μλ μΈμ€ν΄μ€λ₯Ό μ΄κΈ°ν
4. μλΈν΄λμ€ constructorλ‘μ 볡κ·μ this λ°μΈλ©
- superμ νΈμΆμ΄ μ’ λ£λκ³ μΈμ€ν΄μ€λ₯Ό λ°ν
- μλΈν΄λμ€λ λ³λμ μΈμ€ν΄μ€λ₯Ό μμ±νμ§ μκ³ superκ° λ°νν μΈμ€ν΄μ€λ₯Ό thisμ λ°μΈλ©νμ¬ μ¬μ©
5. μλΈν΄λμ€μ μΈμ€ν΄μ€ μ΄κΈ°ν
- μλΈν΄λμ€μ constructorκ° μ€νλμ΄ thisμ λ°μΈλ©λμ΄ μλ μΈμ€ν΄μ€λ₯Ό μ΄κΈ°ν
6. μΈμ€ν΄μ€ λ°ν
- ν΄λμ€μ λͺ¨λ μ²λ¦¬κ° λλλ©΄ μμ±λ μΈμ€ν΄μ€κ° λ°μΈλ©λ thisλ₯Ό μ묡μ μΌλ‘ λ°ν
νμ€ λΉνΈμΈ μμ±μ ν¨μ νμ₯
String, Number, Array κ°μ νμ€ λΉνΈμΈ κ°μ²΄λ [[Construct]] λ΄λΆ λ©μλλ₯Ό κ°λ μμ±μ ν¨μμ΄λ―λ‘ extends ν€μλλ₯Ό μ¬μ©νμ¬ νμ₯ν μ μμ΅λλ€.
// Array μμ±μ ν¨μλ₯Ό μμλ°μ νμ₯ν MyArray
class MyArray extends Array {
// μ€λ³΅λ λ°°μ΄ μμλ₯Ό μ κ±°νκ³ λ°ννλ€: [1, 1, 2, 3] => [1, 2, 3]
uniq() {
return this.filter((v, i, self) => self.indexOf(v) === i);
}
// λͺ¨λ λ°°μ΄ μμμ νκ· μ ꡬνλ€: [1, 2, 3] => 2
average() {
return this.reduce((pre, cur) => pre + cur, 0) / this.length;
}
}
const myArray = new MyArray(1, 1, 2, 3);
console.log(myArray); // MyArray(4) [1, 1, 2, 3]
// MyArray.prototype.uniq νΈμΆ
console.log(myArray.uniq()); // MyArray(3) [1, 2, 3]
// MyArray.prototype.average νΈμΆ
console.log(myArray.average()); // 1.75
μμ μμ μ κ°μ΄ Array μμ±μ ν¨μλ₯Ό μμλ°μ νμ₯ν MyArray ν΄λμ€κ° μμ±ν μΈμ€ν΄μ€λ Array.prototypeκ³Ό MyArray.prototypeμ λͺ¨λ λ©μλλ₯Ό μ¬μ©ν μ μμ΅λλ€.
[μΆμ²] λͺ¨λ μλ°μ€ν¬λ¦½νΈ Deep Dive
'JavaScript > λͺ¨λ μλ°μ€ν¬λ¦½νΈ Deep Dive' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[JavaScript] λ°°μ΄ (0) | 2022.07.31 |
---|---|
[JavaScript] ES6 ν¨μμ μΆκ° κΈ°λ₯ (0) | 2022.07.29 |
[JavaScript] ν΄λ‘μ (0) | 2022.07.27 |
[JavaScript] μ€ν 컨ν μ€νΈ (0) | 2022.07.27 |
[JavaScript] this (0) | 2022.07.26 |
- Total
- Today
- Yesterday
- μλ°μ€ν¬λ¦½νΈ
- ν¬ν¬μΈν°
- μ΄μ체μ
- μΉ΄μΉ΄μ€ μΈν΄
- TDD
- git
- λ€νΈμν¬
- fp
- λͺ¨λ μλ°μ€ν¬λ¦½νΈ deep dive
- μ μ λ³μ
- http
- λ°±μ€
- μλ°
- map
- μκ³ λ¦¬μ¦
- λ°±μ€ javascript
- λ€μ΄λλ―Ή νλ‘κ·Έλλ°
- JavaScript
- λ°±μ€ node.js
- Baekjoon
- μ΄λΆνμ
- ν¨μν νλ‘κ·Έλλ°
- 2019 μΉ΄μΉ΄μ€ κ°λ°μ κ²¨μΈ μΈν΄
- νλ‘ν μ½
- νλ‘κ·Έλλ¨Έμ€
- μ½λ©ν μ€νΈ
- κ°μ²΄μ§ν₯ νλ‘κ·Έλλ°
- λ μ컬 νκ²½
- νλ‘νΌν°
- λμμΈ ν¨ν΄
μΌ | μ | ν | μ | λͺ© | κΈ | ν |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |