μλ°μ€ν¬λ¦½νΈλ
ν΄λμ€
κ° νμκ° μλ νλ‘ν νμ κΈ°λ° κ°μ²΄μ§ν₯ νλ‘κ·Έλλ° μΈμ΄λ€. ES5μμλ ν΄λμ€ μμ΄λμμ±μ ν¨μ
μνλ‘ν νμ
μ ν΅ν΄ κ°μ²΄μ§ν₯ μΈμ΄μ μμμ ꡬνν μ μλ€.
// ES5 μμ±μ ν¨μ
var Person = (function () {
// μμ±μ ν¨μ
function Person(name) {
this.name = name;
}
// νλ‘ν νμ
λ©μλ
Person.prototype.sayHi = function () {
console.log(`Hi! My name is ` + this.name);
};
// μμ±μ ν¨μ λ°ν
return Person;
}());
// μΈμ€ν΄μ€ μμ±
var me = new Person('Lee');
me.sayHi(); // Hi! My name is Lee
ES6μ
ν΄λμ€
κ° κΈ°μ‘΄μ νλ‘ν νμ΄ κΈ°λ° κ°μ²΄μ§ν₯ λͺ¨λΈμ νμ§νκ³ μλ‘κ² ν΄λμ€ κΈ°λ° κ°μ²΄μ§ν₯ λͺ¨λΈμ μ 곡νλ κ²μ μλλ€. μ¬μ€ν΄λμ€
λ ν¨μμ΄λ©° κΈ°μ‘΄ νλ‘ν νμ κΈ°λ° ν¨ν΄μ ν΄λμ€ κΈ°λ° ν¨ν΄μ²λΌ μ¬μ©ν μ μλλ‘ νλλ¬Έλ²μ μ€ν
μ΄λΌκ³ λ³Ό μ μλ€.
λ¨,ν΄λμ€
μμμ±μ ν¨μ
λ λͺ¨λ νλ‘ν νμ κΈ°λ°μ μΈμ€ν΄μ€λ₯Ό μμ±νμ§λ§ μ νν λμΌνκ² λμνμ§λ μλλ€.ν΄λμ€
λμμ±μ ν¨μ
λ³΄λ€ μ격νλ©° μμ±μ ν¨μμμλ μ 곡νμ§ μλ κΈ°λ₯λ μ 곡νλ€.
β ν΄λμ€
λ₯Ό new
μ°μ°μ μμ΄ νΈμΆνλ©΄ μλ¬κ° λ°μνλ€. νμ§λ§ μμ±μ ν¨μ
λ₯Ό new
μ°μ°μ μμ΄ νΈμΆνλ©΄ μΌλ° ν¨μλ‘μ νΈμΆλλ€.
β ν΄λμ€
λ μμμ μ§μνλ extends
μ super
ν€μλλ₯Ό μ 곡νλ€. νμ§λ§ μμ±μ ν¨μ
λ extends
μ super
ν€μλλ₯Ό μ§μνμ§ μλλ€.
β ν΄λμ€
λ νΈμ΄μ€ν
μ΄ λ°μνμ§ μλ κ²μ²λΌ λμνλ€ νμ§λ§ ν¨μ μ μΈλ¬ΈμΌλ‘ μ μλ μμ±μ ν¨μλ ν¨μ νΈμ΄μ€ν
μ΄, ν¨μ ννμμΌλ‘ μ μν μμ±μ ν¨μλ λ³μ νΈμ΄μ€ν
μ΄ λ°μνλ€
β ν΄λμ€
λ΄μ λͺ¨λ μ½λμλ μ묡μ μΌλ‘ strict mode
κ° μ§μ λμ΄ μ€νλλ©° strict mode
λ₯Ό ν΄μ ν μ μλ€. νμ§λ§ μμ±μ ν¨μ
κ° μ§μ λμ§ μλλ€.
β ν΄λμ€
μ constructor
νλ‘ν νμ
λ©μλ
μ μ λ©μλ
λ λͺ¨λ νλ‘νΌν° μ΄νΈλ¦¬λ·°νΈ [[Enuerable]]
μ κ°μ΄ false
λ€. λ€μ λ§ν€, μ΄κ±°λμ§ μλλ€.
μμ±μ ν¨μ
ν΄λμ€
λ νλ‘ν νμ κΈ°λ°μ κ°μ²΄μ§ν₯μ ꡬννλ€λ μ μμ λ§€μ° μ μ¬νμ§λ§,ν΄λμ€
λ κ²¬κ³ νκ³ λͺ λ£νλ©°extends
μsuper
ν€μλλ μμ κ΄κ³ ꡬνμ λμ± κ°κ²°νκ³ λͺ λ£νκ² νλ€. λ°λΌμν΄λμ€
λ μλ‘μ΄ κ°μ²΄ μμ± λ§€μ»€λμ¦μΌλ‘ 보λ κ²μ΄ μ’ λ ν©λΉνλ€.
ν΄λμ€
λclass
ν€μλλ₯Ό μ¬μ©νμ¬ μ μν΄λμ€
μ΄λ¦μμμ±μ ν¨μ
μ λ§μ°¬κ°μ§λ‘νμ€μΉΌ μΌμ΄μ€
λ₯Ό μ¬μ©νλ κ²μ΄ μΌλ°μ . μ¬μ©νμ§ μμλ μλ¬κ° λ°μνμ§λ μμ.
// ν΄λμ€ μ μΈλ¬Έ
Class Person {}
μΌλ°μ μ΄μ§λ μμ§λ§ ν¨μμ λ§μΉκ°μ§λ‘ ννμμΌλ‘
ν΄λμ€
λ₯Ό μ μν μλ μλ€. μ΄λν΄λμ€
λ ν¨μμ λ§μ°¬κ°μ§λ‘ μ΄λ¦μ κ°μ§ μλ μκ³ , κ°μ§ μμ μλ μλ€.
// μ΅λͺ
ν΄λμ€ ννμ
const Person = class {};
// κΈ°λͺ
ν΄λμ€ ννμ
cosnt Person = class MyClass{};
ν΄λμ€
λ₯Ό ννμμΌλ‘ μ μν μ μλ€λ κ²μν΄λμ€
κ° κ°μΌλ‘ μ¬μ©ν μ μλ μΌκΈ κ°μ²΄λΌλ κ²μ μλ―Ένλ€.
β 무λͺ
μ 리ν°λ΄λ‘ μμ±ν μ μλ€. μ¦, λ°νμμ μμ±μ΄ κ°λ₯νλ€.
β λ³μλ μλ£κ΅¬μ‘°(κ°μ²΄, λ°°μ΄ λ±)μ μ μ₯ν μ μλ€.
β ν¨μμ 맀κ°λ³μμκ² μ λ¬ν μ μλ€.
β ν¨μμ λ°νκ°μΌλ‘ μ¬μ©ν μ μλ€.
μ’ λ μμΈν λ§νμλ©΄
ν΄λμ€
λ ν¨μμ΄λ©° κ°μ²λΌ μ¬μ©ν μ μλμΌκΈ κ°μ²΄
λ€.
ν΄λμ€
λͺΈμ²΄μλ 0κ° μ΄μμ λ©μλλ§ μ μν μ μμΌλ©°ν΄λμ€
λͺΈμ²΄μμ μ μν μ μλ λ©μλλconstructor(μμ±μ)
νλ‘ν νμ λ©μλ
μ μ λ©μλ
μΈ κ°μ§κ° μλ€.
// ν΄λμ€ μ μΈλ¬Έ
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 ('Noh');
// μΈμ€ν΄μ€μ νλ‘νΌν° μ°Έμ‘°
console.log(me.name); // Noh
// νλ‘ν νμ
λ©μλ νΈμΆ
me.sayHi(); // Hi! My name is Noh
// μ μ λ©μλ νΈμΆ
Person.sayHello(); // Hello!
// ν΄λμ€λ ν¨μλ‘ νκ°.
class Person {}
console.log(typeof Person); // function
ν΄λμ€
λν΄λμ€
μ μ μ΄μ μ μ°Έμ‘°ν μ μλ€.
console.log(Person);
// ReferenceError: Cannot access 'Person' before initialization
// ν΄λμ€ μ μΈλ¬Έ
class Person {}
ν΄λμ€
μ μΈλ¬Έμ λ§μΉ νΈμ΄μ€ν μ΄ λ°μνμ§ μλ κ²μ²λΌ 보μ΄λ κ·Έλ μ§ μλ€.
const Person = '';
{
// νΈμ΄μ€ν
μ΄ λ°μνμ§ μλλ€λ©΄ ''μ΄ μΆλ ₯λμ΄μΌ νλ€.
// νμ§λ§ class Personμ΄ νΈμ΄μ€ν
μ΄ λ°μν΄ ReferenceError
// ν΄λμ€ μ μΈλ¬Έ
class Person {}
}
ν΄λμ€
μ μΈλ¬Έλλ³μ μ μΈ
ν¨μ μ μ
μ λ§μ°¬κ°μ§λ‘ νΈμ΄μ€ν μ΄ λ°μνλ€. λ¨,ν΄λμ€
λlet
const
ν€μλλ‘ μ μΈν λ³μμ²λΌ νΈμ΄μ€ν λλ€.
λ°λΌμν΄λμ€
λ μ μΈλ¬Έ μ΄μ μμΌμμ μ¬κ°μ§λ(TDZ)
μ λΉ μ§κΈ° λλ¬Έμ νΈμ΄μ€ν μ΄ λ°μνμ§ μλκ²μ²λΌ λμνλ€. λͺ¨λ μ μΈλ¬Έμ λ°νμ μ΄μ μλ°μ€ν¬λ¦½νΈ μμ§μ μν΄ λ¨Όμ μ€νλλ€.
ν΄λμ€
λμμ±μ ν¨μ
μ΄λ©°new
μ°μ°μμ ν¨κ» νΈμΆλμ΄ μΈμ€ν΄μ€λ₯Ό μμ±νλ€.
class Person {}
// μΈμ€ν΄μ€ μμ±
const me = new Person();
console.log(me); // Person{}
ν΄λμ€
λ μΈμ€ν΄μ€λ₯Ό μμ±νλ κ²μ΄ μ μΌν μ‘΄μ¬ μ΄μ μ΄λ―λ‘ λ°λμnew
μ°μ°μμ ν¨κ» νΈμΆν΄μΌ νλ€.
class Person {}
// ν΄λμ€λ₯Ό new μ°μ°μ μμ΄ νΈμΆνλ©΄ νμ
μλ¬κ° λ°μνλ€.
const me = Person();
// TypeError: Class constructor Foo cannot be invoked without 'new'
ν΄λμ€
ννμμΌλ‘ μ μλν΄λμ€
μ κ²½μ°ν΄λμ€
λ₯Ό κ°λ¦¬ν€λ μλ³μ(Person
)λ₯Ό μ¬μ©ν΄ μΈμ€ν΄μ€λ₯Ό μμ±νμ§ μκ³ κΈ°λͺ ν΄λμ€ ννμμ ν΄λμ€ μ΄λ¦(MyClass
)μ μ¬μ©ν΄ μΈμ€ν΄μ€λ₯Ό μμ±νλ©΄ μλ¬κ° λ°μνλ€.
const Person = class MyClass {};
// ν¨μ ννμκ³Ό λ§μ°¬κ°μ§λ‘ ν΄λμ€λ₯Ό κ°λ¦¬ν€λ μλ³μλ‘ μΈμ€ν΄μ€λ₯Ό μμ±ν΄μΌ νλ€.
const me = new Person();
// ν΄λμ€ μ΄λ¦ MyClassλ ν¨μμ λμΌνκ² ν΄λμ€ λͺΈμ²΄ λ΄λΆμμλ§ μ ν¨ν μλ³μλ€.
console.log(MyClass); // ReferenceError: MyClass is not defined
const you = new MyClass(); // ReferenceError: MyClass is not defined
ν΄λμ€
λͺΈμ²΄μλ 0κ° μ΄μμ λ©μλλ§ μ μΈν μ μλ€.ν΄λμ€
λͺΈμ²΄μμ μ μν μ μλ λ©μλλconstructor(μμ±μ)
νλ‘ν νμ λ©μλ
μ μ λ©μλ
μΈ κ°μ§κ° μλ€.
- ECMAScript μ¬μμ λ°λ₯΄λ©΄ μΈμ€ν΄μ€ νλ‘νΌν°λ λ°λμ
constructor
λ΄λΆμμ μ μν΄μΌ νλ€.- νμ§λ§ ν΄λμ€ λͺΈμ²΄μ λ©μλλΏλ§μ΄ μλλΌ νλ‘νΌν°λ μ μν μ μκ² μλ‘μ΄ νμ€ μ¬μμ΄ μ μλμ΄ μλ€.
- μ΅μ λͺ¨λ λΈλΌμ°μ μλ μ΄λ―Έ λ°μλμ΄ μ¬μ©μ΄ κ°λ₯νλ€.
constructor
λ μΈμ€ν΄μ€λ₯Ό μμ±νκ³ μ΄κΈ°ννκΈ° μν νΉμ λ©μλλ€.constructor
λ μ΄λ¦μ λ³κ²½ν μ μλ€.
class Person {
// μμ±μ
constructor(name) {
// μΈμ€ν΄μ€ μμ± λ° μ΄κΈ°ν
this.name = name;
}
}
// ν΄λμ€
class Person {
// μμ±μ
constructor(name) {
// μΈμ€ν΄μ€ μμ± λ° μ΄κΈ°ν
this.name = name;
}
}
// μμ±μ ν¨μ
function Person(name) {
// μΈμ€ν΄μ€ μμ± λ° μ΄κΈ°ν
this.name = name;
}
1οΈβ£
constructor
λ΄λΆμμthis
μ μΆκ°ν νλ‘νΌν°λ μΈμ€ν΄μ€ νλ‘νΌν°κ° λλ€.
2οΈβ£constructor
λ΄λΆμthis
λμμ±μ ν¨μ
μ λ§μ°¬κ°μ§λ‘ν΄λμ€
κ° μμ±ν μΈμ€ν΄μ€λ₯Ό κ°λ¦¬ν¨λ€.
3οΈβ£ν΄λμ€
κ° μμ±ν μΈμ€ν΄μ€λν΄λμ€
κ° νκ°λμ΄ μμ±λ ν¨μ κ°μ²΄ μ΄λμλconstructor
λ©μλκ° λ³΄μ΄μ§ μλλ€λ κ². μ΄λν΄λμ€
λͺΈμ²΄μ μ μνconstructor
κ° λ¨μν λ©μλκ° μλλΌλ κ²μ μλ―Έ.
constructor
λ λ©μλλ‘ ν΄μλλ κ²μ΄ μλλΌν΄λμ€
κ° νκ°λμ΄ μμ±ν ν¨μ κ°μ²΄ μ½λμ μΌλΆκ° λλ€.
4οΈβ£constructor
λν΄λμ€
λ΄μ μ΅λ ν κ°λ§ μ‘΄μ¬ν μ μλ€. λ§μ½ν΄λμ€
κ° 2κ° μ΄μμconstructor
λ₯Ό ν¬ν¨νλ©΄SyntaxError
κ° λ°μνλ€.
5οΈβ£constructor
λ μλ΅ν μ μλ€.
6οΈβ£constructor
λ₯Ό μλ΅νλ©΄ν΄λμ€
μ λ€μκ³Ό κ°μ΄ λΉconstructor
κ° μ묡μ μΌλ‘ μ μλλ€.
7οΈβ£constructor
λ₯Ό μλ΅νν΄λμ€
λ λΉconstructor
μ μν΄ λΉ κ°μ²΄λ₯Ό μμ±νλ€.
8οΈβ£ μΈμ€ν΄μ€ μμ±ν λν΄λμ€
μΈλΆμμ μΈμ€ν΄μ€ νλ‘νΌν°μ μ΄κΈ°κ°μ μ λ¬νλ €λ©΄constructor
μ 맀κ°λ³μλ₯Ό μ μΈνκ³ μΈμ€ν΄μ€λ₯Ό μμ±ν λ μ΄κΈ° κ°μ μ λ¬νλ€.
class Person {
constructor(name, address) {
// μΈμλ‘ μΈμ€ν΄μ€ μ΄κΈ°ν
this.name = name;
this.address = address;
}
}
// μΈμλ‘ μ΄κΈ°κ°μ μ λ¬νλ€. μ΄κΈ°κ°μ constructorμ μ λ¬λλ€.
const me = new Person('Lee', 'Seoul');
console.log(me);
9οΈβ£
constructor
λ λ³λμ λ°νλ¬Έ(return
)μ κ°μ§ μμμΌ νλ€. νμ§λ§ λͺ μμ μΌλ‘ μμκ°μ λ°ννλ©΄ μμκ° λ°νΈλμ 무μλκ³ μ묡μ μΌλ‘this
κ° λ°νλλ€.
ν΄λμ€
μconstructor
λ©μλμ νλ‘ν νμ μconstructor
νλ‘νΌν°λ μ΄λ¦μ΄ κ°μ νΌλνκΈ° μ½μ§λ§ μ§μ μ μΈ κ΄λ ¨μ΄ μλ€. νλ‘ν νμ μconstructor
νλ‘νΌν°λ λͺ¨λ νλ‘ν νμ μ΄ κ°μ§κ³ μλ νλ‘νΌν°μ΄λ©°,μμ±μ ν¨μ
λ₯Ό κ°λ¦¬ν¨λ€.
β μμ±μ ν¨μμμ νλ‘ν νμ λ©μλ μμ±
// μμ±μ ν¨μ
function Person(name) {
this.name = name;
}
// νλ‘ν νμ
λ©μλ
Person.prototype.sayHi = function () {
console.log(`Hi! My name is ${this.name}`);
};
const me = new Person('Lee');
me.sayHi(); // Hi! My name is Lee
β ν΄λμ€μμ νλ‘ν νμ λ©μλ μμ±.
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.prototypedlek.
Object.getProtype(me) === Person.prototype; // true
me instanceof Person; // true
// Person.prototypeμ νλ‘ν νμ
μ Object.prototypedlek.
Object.getProtypeOf(Person.prototype) === Object.prototype; // true
me instanceof Object // true
// me κ°μ²΄μ constructorλ Person ν΄λμ€λ€.
me.construcotr === Person // true
μ μ λ©μλλ μΈμ€ν΄μ€λ₯Ό μμ±νμ§ μμλ νΈμΆν μ μλ λ©μλλ₯Ό λ§νλ€.
μμ±μ ν¨μ μ μ λ©μλ
// μμ±μ ν¨μ
function Person(name) {
this.name = name;
}
// μ μ λ©μλ
Person.sayHi = function () {
console.log('Hi!');
};
// μ μ λ©μλ νΈμΆ
Person.sayHi(); // Hi!
ν΄λμ€
μμλ λ©μλμstatic
ν€μλλ₯Ό λΆμ΄λ©΄ μ μ λ©μλ(ν΄λμ€ λ©μλ)κ° λλ€.
class Person {
// μμ±μ
constructor(name) {
// μΈμ€ν΄μ€ μμ± λ° μ΄κΈ°ν
this.name = name;
}
// μ μ λ©μλ
static sayHi() {
console.log('Hi!');
}
}
1οΈβ£ μ μ λ©μλλ
ν΄λμ€
μ λ°μΈλ©λ λ©μλκ° λλ©°,ν΄λμ€
λ ν¨μ κ°μ²΄λ‘ νκ°λλ―λ‘ μμ μνλ‘νΌν° / λ©μλ
λ₯Ό μμ ν μ μλ€.
2οΈβ£ν΄λμ€
λν΄λμ€
μ μκ° νκ° λλ μμ μ ν¨μ κ°μ²΄κ° λλ―λ‘ μΈμ€ν΄μ€μ λ¬λ¦¬ λ³λ€λ₯Έ μμ± κ³Όμ μ΄ νμ μλ€. λ°λΌμ μ μ λ©μλλ ν΄λμ€ μ μ μ΄ν μΈμ€ν΄μ€λ₯Ό μμ±νμ§ μμλ νΈμΆν μ μλ€.
3οΈβ£ μ μ λ©μλλ μΈμ€ν΄μ€λ‘ νΈμΆν μ μλ€. μ μ λ©μλκ° λ°μΈλ©λν΄λμ€
μμ±μ ν¨μ
μμλ μΈμ€ν΄μ€μ νλ‘ν νμ 체μΈμμ μ‘΄μ¬νμ§ μκΈ° λλ¬Έ.
1οΈβ£ μ μ λ©μλμ νλ‘ν νμ λ©μλλ μμ μ΄ μν΄ μλ νλ‘ν νμ 체μΈμ΄ λ€λ₯΄λ€.
2οΈβ£ μ μ λ©μλλν΄λμ€
λ‘ νΈμΆνκ³ νλ‘ν νμ λ©μλλ μΈμ€ν΄μ€λ‘ νΈμΆνλ€.
3οΈβ£ μ μ λ©μλλ μΈμ€ν΄μ€ νλ‘νΌν°λ₯Ό μ°Έμ‘°ν μ μμ§λ§ νλ‘ν νμ λ©μλλ μΈμ€ν΄μ€ νλ‘νΌν°λ₯Ό μ°Έμ‘°ν μ μλ€.
μ μ λ©μλ μμ
class Square {
// μ μ λ©μλ
static area(width, height) {
return width * height;
}
}
console.log(Square.area(10, 10)); // 100
νλ‘ν νμ λ©μλ μμ
class Square {
constructor(width, height) {
this.width = width;
this.height = height;
}
// νλ‘ν νμ
λ©μλ
area() {
return this.width * this.height;
}
}
const square = new Square(10, 10);
console.log(square.area()); // 100
// νμ€ λΉνΈμΈ κ°μ²΄μ μ μ λ©μλ
Math.max(1, 2, 3); // -> 3
Number.isNaN(NaN); // -> true
JSON.stringify({ a: 1 }); // -> "{"a":1}"
Object.is({}, {}); // -> false
Reflect.has({ a: 1 }, 'a'); // -> true
1οΈβ£
function
ν€μλλ₯Ό μλ΅ν λ©μλ μΆμ½ ννμ μ¬μ©νλ€.
2οΈβ£ κ°μ²΄ 리ν°λ΄κ³Όλ λ€λ₯΄κ² ν΄λμ€μ λ©μλλ₯Ό μ μν λλ μ½€λ§κ° νμ μλ€.
3οΈβ£ μ묡μ μΌλ‘strict mode
λ‘ μ€νλλ€
4οΈβ£for ... in
λ¬Έμ΄λObject.keys
λ©μλ λ±μΌλ‘ μ΄κ±°ν μ μλ€. μ¦, νλ‘νΌν°μ μ΄κ±° κ°λ₯ μ¬λΆλ₯Ό λνλ΄λ©°, λΆλ¦¬μΈ κ°μ κ°λ νλ‘νΌν° μ΄νΈλ¦¬λ·°νΈ[[Enumerable]]
μ κ°μ΄fasle
λ€.
5οΈβ£ λ΄λΆ λ©μλ[[Construct]]
λ₯Ό κ°μ§ μλnon-constructor
λ€.(newμ°μ°μ
μ ν¨κ» νΈμΆν μ μλ€.)
new
μ°μ°μμ ν¨κ»ν΄λμ€
λ₯Ό νΈμΆνλ©΄ μ묡μ μΌλ‘ λΉ κ°μ²΄κ° μμ±.- ν΄λμ€κ° μμ±ν μΈμ€ν΄μ€μ νλ‘ν νμ ν΄λμ€μ
prototype νλ‘νΌν°
λ‘ λ°μΈλ©.- μ묡μ μΌλ‘ μμ±λ λΉ κ°μ²΄ μ¦, μΈμ€ν΄μ€λ
this
μ λ°μΈλ©λλ€.
this
μ λ°μΈλ©λμ΄ μλ μΈμ€ν΄μ€μ νλ‘νΌν°λ₯Ό μΆκ°νκ³constructor
κ° μΈμλ‘ μ λ¬λ°μ μ΄κΈ°κ°μΌλ‘ μΈμ€ν΄μ€μ νλ‘νΌν° κ°μ μ΄κΈ°ννλ€.- λ§μ½
constructor
κ° μλ΅λμλ€λ©΄ μ΄ κ³Όμ λ μλ΅λλ€.
ν΄λμ€
μ λͺ¨λ μ²λ¦¬κ° λλλ©΄ μμ±λ μΈμ€ν΄μ€κ° λ°μΈλ©λthis
κ° μ묡μ μΌλ‘ λ°νλλ€.
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κ° μ묡μ μΌλ‘ λ°νλλ€.
}
}
μΈμ€ν΄μ€ νλ‘νΌν°λ
constructor
λ΄λΆμμ μ μν΄μΌ νλ€.
class Person {
constructor(name) {
// μΈμ€ν΄μ€ νλ‘νΌν°
this.name = name; // name νλ‘νΌν°λ publicνλ€.
}
}
const me = new Person('Lee);
// nameμ publicνλ€.
console.log(me); // Person {name: "Lee"}
constructor
μ½λκ° μ€νλκΈ° μ΄μ μconstructor
λ΄λΆμthis
μλ μ΄λ―Έν΄λμ€
κ° μμ±ν λΉ κ°μ²΄κ° λ°μΈλ©λμ΄ μλ€.constructor
λ΄λΆμμthis
μ μΈμ€ν΄μ€λ₯Ό νλ‘νΌν°λ₯Ό μΆκ°νλ€.constructor
λ΄λΆμμthis
μ μΆκ°ν νλ‘νΌν°λ μΈμ λν΄λμ€
κ° μμ±ν μΈμ€ν΄μ€μ νλ‘νΌν°κ° λλ€.- μΈμ€ν΄μ€ νλ‘νΌν°λ μΈμ λ
public
νλ€.
μ κ·Όμ νλ‘νΌν°
λ μ체μ μΌλ‘ κ°[[Value]]
μ κ°μ§ μκ³ λ€λ₯Έ λ°μ΄ν° νλ‘νΌν°μ κ°μ μ½κ±°λ μ μ₯ν λ μ¬μ©νλ μ κ·Όμ ν¨μλ‘ κ΅¬μ±λ νλ‘νΌν°λ€.
class Person {
constructor(firstName, lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
// fullNameμ μ κ·Όμ ν¨μλ‘ κ΅¬μ±λ μ κ·Όμ νλ‘νΌν°λ€.
// getter ν¨μ
get fullName() {
return `${this.firstName} ${this.lastName}`
}
set fullName() {
[this.firstName, this.lastName] = name.split(' ');
}
}
const me = new Person('Ungmo', 'Lee');
// λ°μ΄ν° νλ‘νΌν°λ₯Ό ν΅ν νλ‘νΌν° κ°μ μ°Έμ‘°.
console.log(`${me.firstName} ${me.lastName}`) // Ungmo Lee
// μ κ·Όμ νλ‘νΌν°λ₯Ό ν΅ν νλ‘νΌν° κ°μ μ μ₯
// μ κ·Όμ νλ‘νΌν° fullNameμ κ°μ μ μ₯νλ©΄ setter ν¨μκ° νΈμΆλλ€.
me.fullName = 'Heegun Lee';
console.log(me); // {firstName: 'Heegun', lastName: 'Lee'}
// μ κ·Όμ νλ‘νΌν°λ₯Ό ν΅ν νλ‘νΌν° κ°μ μ°Έμ‘°
// μ κ·Όμ νλ‘νΌν° fullNameμ μ κ·Όνλ©΄ getter ν¨μκ° νΈμΆλλ€.
console.log(me.fullName); // Heegun Lee
// fullNameμ μ κ·Όμ νλ‘νΌν°λ€.
// μ κ·Όμ νλ‘νΌν°λ get, set, enumerable, configurable νλ‘νΌν° μ΄νΈλ¦¬λ·°νΈλ₯Ό κ°λλ€.
console.log(Object.getOwnPropertyDescriptor(Person.prototype, 'fullName'));
// {get: Ζ, set: Ζ, enumerable: false, configurable: true}
1οΈβ£ μ κ·Όμ νλ‘νΌν°λ ν΄λμ€μμλ μ¬μ©ν μ μλ€.
2οΈβ£μ κ·Όμ νλ‘νΌν°λ μ체μ μΌλ‘λ κ°μ κ°μ§ μκ³ λ€λ₯Έ λ°μ΄ν° νλ‘νΌν°μ κ°μ μ½κ±°λ μ μ₯ν λ μ¬μ©νλ μ κ·Όμ ν¨μ, μ¦getter
ν¨μμsetter
ν¨μλ‘ κ΅¬μ±λμ΄ μλ€.
3οΈβ£getter
λ λ©μλ μ΄λ¦ μμget
ν€μλλ₯Ό μ¬μ©ν΄ μ μνλ€.
4οΈβ£setter
λ λ©μλ μ΄λ¦ μμ setν€μλλ₯Ό μ¬μ©ν΄ μ μνλ€.
5οΈβ£getter
λ μ°Έμ‘°νλ νμμΌλ‘ μ¬μ©λλ©°, 무μΈκ°λ₯Ό μ·¨λν λ μ¬μ©νλ―λ‘ λ°λμ 무μΈκ°λ₯Ό λ°νν΄μΌ νλ€.
6οΈβ£setter
λ νλ‘νΌν°μ ν λΉν΄μΌ ν λ μ¬μ©νλ―λ‘ λ°λμ 맀κ°λ³μκ° μμ΄μΌ νλ€.
7οΈβ£getter
setter
μ΄λ¦μ μΈμ€ν΄μ€ νλ‘νΌν°μ²λΌ μ¬μ©λλ€.
8οΈβ£μ κ·Όμ νλ‘νΌν°λ μΈμ€ν΄μ€μ νλ‘λ‘νμ μ΄ μλλΌ νλ‘ν νμ μ νλ‘νΌν°κ° λλ€.
ν΄λμ€ νλ(νλ λλ 맴λ²)
λ, ν΄λμ€ κΈ°λ° κ°μ²΄μ§ν₯ μΈμ΄μμ ν΄λμ€κ° μμ±ν μΈμ€ν΄μ€μ νλ‘νΌν°λ₯Ό κ°λ¦¬ν€λ μ©μ΄λ€.
μλ°μ€ν¬λ¦½νΈμν΄λμ€
λͺΈμ²΄μλ λ©μλλ§ μ μΈν μ μλ€. λ°λΌμν΄λμ€
λͺΈμ²΄μν΄λμ€ νλ
λ₯Ό μ μΈνλ©΄SyntaxError
κ° λ°μνλ€.
class Person {
// ν΄λμ€ νλ μ μ
name = 'Lee';
}
const me = new Person();
console.log(me); // Person {name: "Lee"}
νμ§λ§ μ μμ λ₯Ό μ΅μ λΈλΌμ°μ (Chrome 72 μ΄μ) λλ μ΅μ Node.js(λ²μ 12 μ΄μ)μμ μ€ννλ©΄
SyntaxError
κ° λ°μνμ§ μκ³ μ μ λμνλ€.
κ·Έ μ΄μ λ μλ°μ€ν¬λ¦½νΈμμλ μΈμ€ν΄μ€ νλ‘νΌν°λ₯Ό λ§μΉ ν΄λμ€ κΈ°λ° κ°μ²΄μ§ν₯ μΈμ΄μ ν΄λμ€ νλμ²λΌ μ μν μ μλ μλ‘μ΄ νμ€ μ¬μμΈ βClass field declarationsβκ°TC39νλ‘μΈμ€
μ stage 3(candidate)μ μ μλμ΄ μκΈ° λλ¬Έμ΄λ€.
TC39 νλ‘μΈμ€
ν΄λμ€
λͺΈμ²΄μμ ν΄λμ€ νλλ₯Ό μ μνλ κ²½μ°this
μν΄λμ€ νλ
λ₯Ό λ°μΈλ© ν΄μλ μλλ€.this
λ ν΄λμ€μconstructor
μ λ©μλ λ΄μμλ§ μ ν¨νλ€.
class Person {
// thisμ ν΄λμ€ νλλ₯Ό λ°μΈλ©ν΄μλ μλλ€.
this.name = ''; // SyntaxError: Unexpected token '.'
}
ν΄λμ€ νλ
λ₯Ό μ°Έμ‘°νλ κ²½μ° μλ°μ€ν¬λ¦½νΈμμλ this
λ₯Ό λ°λμ μ¬μ©ν΄μΌ νλ€.class Person {
// ν΄λμ€ νλ
name = 'Lee';
constructor() {
// μ°Έμ‘°ν λλ thisλ₯Ό λ°λμ μ¬μ©ν΄μΌ νλ€.
console.log(name); // ReferenceError: name is not defined
}
}
new Person();
ν΄λμ€ νλ
μ μ΄κΈ°κ°μ ν λΉνμ§ μμΌλ©΄ undefined
λ₯Ό κ°λλ€.constructor
μμ ν΄μΌ νλ€.class Person {
name;
constructor(name) {
// μ΄κΈ°νν λλ constructorμμ ν΄μΌνλ€.
// ν΄λμ€ νλ μ΄κΈ°ν.
this.name = name;
}
}
const me = new Person('Lee');
console.log(me); // Person {name: "Lee"}
- ν¨μλ μΌκΈ κ°μ²΄μ΄λ―λ‘ ν¨μλ₯Ό ν΄λμ€ νλμ ν λΉν μ μλ€.
ν΄λμ€ νλ
μ ν¨μλ₯Ό ν λΉνλ κ²½μ°, μ΄ ν¨μλ νλ‘ν νμ λ©μλκ° μλ μΈμ€ν΄μ€ λ©μλκ° λλ€.(ν΄λμ€ νλ
μ ν¨μλ₯Ό ν λΉνλ κ²μ κΆμ₯νμ§ μλλ€.)
class Person {
// ν΄λμ€ νλμ λ¬Έμμ΄μ ν λΉ
name = 'Lee';
// ν΄λμ€ νλμ ν¨μλ₯Ό ν λΉ
getName = function () {
return this.name;
}
// νμ΄ν ν¨μλ‘ μ μν μλ μλ€.
// νμ΄ν ν¨μ λ΄λΆμ thisλ μΈμ λ μμ 컨ν
μ€νΈμ thisλ₯Ό κ°λ¦¬ν¨λ€.
// getName = () => this.name;
}
const me = new Person();
console.log(me); // Person {name: "Lee", getName: Ζ}
console.log(me.getName()); // Lee
μΈμ€ν΄μ€ νλ‘νΌν°λ μΈμ€ν΄μ€λ₯Ό ν΅ν΄
ν΄λμ€
μΈλΆμμ μΈμ λ μ°Έμ‘°ν μ μλ€. μ¦, μΈμ λpublic
μ΄λ€.
TC39
νλ‘μΈμ€μstage 3
μλprivate
λ₯Ό μ μ ν μ μλ μλ‘μ΄ νμ€ μ¬μμ΄ μ μ λμ΄ μλ€. νμ€ μ¬μμΌλ‘ μΉκΈμ΄ νμ€μλλ μ΄ μ μλ μ΅μ° λΈλΌμ°μ (Chrome 74 μ΄μ
)μ μ΅μ°Node.js(λ²μ 12 μ΄μ)
μ μ΄λ―Έ ꡬνλμ΄ μλ€.
private
νλμ μ λμλ#
μ λΆμ¬μ€λ€.private
νλλ₯Ό μ°Έμ‘°ν λλ#
μ λΆμ¬μ£Όμ΄μΌ νλ€.
class Person {
// private νλ μ μ
#name = '';
constructor(name) {
// private νλ μ°Έμ‘°
this.#name = name;
}
}
const me = new Person('Lee');
// private νλ #nameμ ν΄λμ€ μΈλΆμμ μ°Έμ‘°ν μ μλ€.
console.log(me.#name);
// SyntaxError: Private field '#name' must be declared in an enclosing class
ν΄λμ€ μΈλΆμμ
private
νλμ μ§μ μ κ·Όν μ μλ λ°©λ²μ μλ€. λ€λ§ μ κ·Όμ νλ‘νΌν°λ₯Ό ν΅ν΄ κ°μ μ μΌλ‘ μ κ·Όνλ λ°©λ²μ μ ν¨νλ€,
class Person {
// private νλ μ μ
#name = '';
constructor(name) {
this.#name = name;
}
// nameμ μ κ·Όμ νλ‘νΌν°λ€.
get name() {
// private νλλ₯Ό μ°Έμ‘°νμ¬ trimν λ€μ λ°ννλ€.
return this.#name.trim();
}
}
const me = new Person('Lee');
console.log(me.name); // Lee
private
νλλ λ°λμν΄λμ€
λͺΈμ²΄μ μ μν΄μΌ νλ€.privagte
νλλ₯Ό μ§μ contructor
μ μ μνλ©΄ μλ¬κ° λ°μνλ€.
class Person {
constructor(name) {
// private νλλ ν΄λμ€ λͺΈμ²΄μμ μ μν΄μΌ νλ€.
this.#name = name;
// SyntaxError: Private field '#name' must be declared in an enclosing class
}
}
static
ν€μλλ₯Ό μ¬μ©νμ¬static public field
,static private field
,static private λ©μλ
λ₯Ό μ μν μ μλ μλ‘μ΄ νμ€ μ¬μμΈβStatic class featuresβ
κ° TC39 νλ‘μΈμ€μ stage 3(candidate)μ μ μλμ΄ μλ€.- μ΅μ λΈλΌμ°μ (chrome 72μ΄μ)μ Node.js(λ²μ 12 μ΄μ)μ μ΄λ―Έ ꡬνλμ΄ μλ€.
class MyMath {
// static public νλ μ μ
static PI = 22 / 7;
// static private νλ μ μ
static #num = 10;
// static λ©μλ
static increment() {
return ++MyMath.#num;
}
}
console.log(MyMath.PI); // 3.142857142857143
console.log(MyMath.increment()); // 11
μμμ μν ν΄λμ€ νμ₯μ μ§κΈκΉμ§ μ΄ν΄λ³Έ νλ‘ν νμ κΈ°λ° μμκ³Όλ λ€λ₯Έ κ°λ .
νλ‘ν νμ κΈ°λ° μμμ νλ‘ν νμ 체μΈμ ν΅ν΄ λ€λ₯Έ κ°μ²΄μ μμ°μ μμλ°λ κ°λ μ΄μ§λ§ μμμ μν ν΄λμ€ νμ₯μ κΈ°μ‘΄ ν΄λμ€λ₯Ό μμλ°μ μλ‘μ΄ ν΄λμ€λ₯Ό νμ₯(extends
)νμ¬ μ μνλ κ².
ν΄λμ€λ μμμ ν΅ν΄ κΈ°μ‘΄ ν΄λμ€λ₯Ό νμ₯ν μ μλ λ¬Έλ²μ΄ κΈ°λ³Έμ μΌλ‘ μ 곡λμ§λ§ μμ±μ ν¨μλ κ·Έλ μ§ μλ€.
class Animal {
constructor(age, weight) {
this.age = age;
this.weight = weight;
}
eat() { return 'eat'; }
move() { return 'move'; }
}
// μμμ ν΅ν΄ Animal ν΄λμ€λ₯Ό νμ₯ν Bird ν΄λμ€
class Bird extends Animal {
fly () { return 'fly'; }
}
const bird = new Bird(1, 5);
console.log(bird); // Bird {age: 1, weight: 5}
console.log(bird instanceof Bird); // true
console.log(bird instanceof Animal); // true
console.log(bird.eat()); // eat
console.log(bird.move()); // move
console.log(bird.fly()); // fly
μμμ ν΅ν΄
ν΄λμ€
λ₯Ό νμ₯νλ €λ©΄extends
ν€μλλ₯Ό μ¬μ©νμ¬ μμλ°μν΄λμ€
λ₯Ό μ μνλ€.
// μνΌ(λ² μ΄μ€/λΆλͺ¨)ν΄λμ€
class Base {}
// μλΈ(νμ/μμ)ν΄λμ€
class Derived extends Base {}
extends
ν€μλ μν μμνΌν΄λμ€
μμλΈν΄λμ€
κ°μ μμ κ΄κ³λ₯Ό μ€μ νλ κ².ν΄λμ€
λ νλ‘ν νμ μ ν΅ν΄ μμ κ΄κ³λ₯Ό ꡬν.
μνΌν΄λμ€μ μλΈν΄λμ€λ μΈμ€ν΄μ€μ νλ‘ν νμ 체μΈλΏ μλλΌ ν΄λμ€ κ°μ νλ‘ν νμ 체μΈλ μμ±νλ€. μ΄λ₯Ό ν΅ν΄ νλ‘ν νμ λ©μλ, μ μ λ©μλ λͺ¨λ μμμ΄ κ°λ₯νλ€.
extends
ν€μλλ ν΄λμ€ λΏλ§ μλλΌ μμ±μ ν¨μλ₯Ό μμλ°μν΄λμ€
λ₯Ό νμ₯ν μλ μλ€. λ¨,extends
ν€μλ μμλ λ°λμν΄λμ€
κ° μμΌ νλ€.
// μμ±μ ν¨μ
function Base(a) {
this.a = a;
}
// μμ±μ ν¨μλ₯Ό μμλ°λ μλΈν΄λμ€
class Derived extends Base{}
const derived = new Derived(1);
console.log(derived); // Derived {a: 1}
extends
ν€μλ λ€μμλν΄λμ€
λΏλ§ μλλΌ[[Construct]]
λ΄λΆ λ©μλλ₯Ό κ°λ ν¨μ κ°μ²΄λ‘ νκ°λ μ μλ λͺ¨λ ννμμ μ¬μ©ν μ μλ€.(μ΄λ₯Ό ν΅ν΄ λμ μΌλ‘ μμκ°λ₯)
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
λ₯Ό μλ΅νλ©΄ μ묡μ μΌλ‘ μ μλλ€.
// μνΌν΄λμ€
class Base {}
// μλΈν΄λμ€
class Derived extends Base {}
μ μ κ°μ΄ μλ΅λ κ²½μ° μλμ κ°μ΄ μ묡μ μΌλ‘ μμ±λλ€.
// μνΌν΄λμ€
class Base {
constructor() {}
}
// μλΈν΄λμ€
class Derived extends Base {
constructor() { super(); }
}
const derived = new Derived();
console.log(derived); // Derived {}
super
ν€μλλ ν¨μμ²λΌ νΈμΆν μ λ μκ³this
μ κ°μ΄ μλ³μμ²λΌ μ°Έμ‘°ν μ μλ νΉμν ν€μλλ€.
βsuper
λ₯Ό νΈμΆνλ©΄ μνΌν΄λμ€μconstructor(super-construcotr)
λ₯Ό νΈμΆνλ€.
**βsuper
λ₯Ό μ°Έμ‘°νλ©΄ μνΌν΄λμ€μ λ©μλλ₯Ό νΈμΆν μ μλ€.
super
λ₯Ό νΈμΆνλ©΄ μνΌν΄λμ€μconstructor(super-constructor)
λ₯Ό νΈμΆνλ€.
μνΌν΄λμ€
μconstructor
λ΄λΆμμ μΆκ°ν νλ‘νΌν°λ₯Ό κ·Έλλ‘ κ°λ μΈμ€ν΄μ€λ₯Ό μμ± νλ€λ©΄μλΈν΄λμ€
μconstrucotr
λ₯Ό μλ΅ν μ μλ€. μ΄λnew
μ°μ°μμ ν¨κ» μλΈν΄λμ€λ₯Ό νΈμΆνλ©΄ μ λ¬ν μΈμλ λͺ¨λ μλΈν΄λμ€μ μ묡μ μΌλ‘ μ μλconstrucotr
μsuper
νΈμΆμ ν΅ν΄ μνΌν΄λμ€μconstructor
μ μ λ¬λλ€.
// μνΌν΄λμ€
class Base {
constructor(a, b) {
this.a = a;
this.b = b;
}
}
// μλΈν΄λμ€
class Derived extends Base {
// λ€μκ³Ό κ°μ΄ μ묡μ μΌλ‘ constructorκ° μ μλλ€.
// constructor(...args) { super(...args); }
}
const derived = new Derived(1, 2);
console.log(derived); // Derived {a: 1, b: 2}
- μλΈν΄λμ€μμ
constructor
λ₯Ό μλ΅νμ§ μλ κ²½μ° μλΈν΄λμ€μconstructor
μμλ λ°λμsuper
λ₯Ό νΈμΆν΄μΌ νλ€.
class Base {}
class Derived extends Base {
constructor() {
// ReferenceError: Must call super constructor in derived class before accessing 'this' or returning from derived constructor
console.log('constructor call');
}
}
const derived = new Derived();
- μλΈν΄λμ€μ
constructor
μμsuper
λ₯Ό νΈμΆνκΈ° μ μλthis
λ₯Ό μ°Έμ‘°ν μ μλ€.(μΈμ€ν΄μ€ μμ±κ³Ό thisλ°μΈλ©μ μνΌν΄λμ€μμ νκΈ° λλ¬Έμ΄λ€.)
class Base {}
class Derived extends Base {
constructor() {
// ReferenceError: Must call super constructor in derived class before accessing 'this' or returning from derived constructor
this.a = 1;
super();
}
}
const derived = new Derived(1);
super
λ λ°λμ μλΈν΄λμ€μconstructor
μμλ§ νΈμΆνλ€. μλΈν΄λμ€κ° μλ ν΄λμ€μconsturcotr
λ ν¨μμμsuper
λ₯Ό νΈμΆνλ©΄ μλ¬κ° λ°μνλ€.
class Base {
constructor() {
super(); // SyntaxError: 'super' keyword unexpected here
}
}
function Foo() {
super(); // SyntaxError: 'super' keyword unexpected here
}
λ©μλ λ΄μμ
super
λ₯Ό μ°Έμ‘°νλ©΄ μνΌν΄λμ€μ λ©μλλ₯Ό νΈμΆν μ μλ€.
μλΈν΄λμ€μ νλ‘ν νμ λ©μλ λ΄μμsuper.sayHi
λ μνΌν΄λμ€μ νν ν νμ λ©μλsayHi
λ₯Ό κ°λ¦¬ν¨λ€.
// μνΌν΄λμ€
class Base {
constructor(name) {
this.name = name;
}
sayHi() {
return `Hi ${this.name}`'
}
}
// μλΈν΄λμ€
class Derived extends Base {
sayHi() {
// super.sayHiλ μνΌν΄λμ€μ νλ‘ν νμ
λ©μλλ₯Ό κ°λ¦¬ν¨λ€.
return `${super.sayHi()}. how are you doing?`;
}
}
const derived = new Derived('Lee');
console.log(derived.sayHi()); // Hi! Lee. how are you doing
super.sayHi
λBase.prototype.sayHi
λ₯Ό κ°λ¦¬ν¨λ€.
μ¦super
λ μμ μ μ°Έμ‘°νκ³ μλ λ©μλκ° λ°μΈλ© λμ΄μλ κ°μ²΄μ νλ‘ν νμ μ κ°λ¦¬ν¨λ€.(Derived
μsayHi
λ©μλκ° λ°μΈλ© λμ΄μλ κ°μ²΄derived
μ νλ‘ν νμ μΈBase.prototype
μ κ°λ¦¬ν¨λ€.)
superμ°Έμ‘°
μ λμμDerivedν΄λμ€
μsayHiλ©μλ
μ[[HomeObject]]
λ΄λΆ μ¬λ‘―μ ν΅ν΄ μμ μ λ°μΈλ©νλ κ°μ²΄λ₯Ό μμμλ€.
μμ μ λ°μΈλ©νλ κ°μ²΄λ₯Ό μλ©΄ νλ‘ν νμ 체μΈμ ν΅ν΄super
λ₯Ό μ°Έμ‘°ν μ μκ²λλ€.
μ£Όμν μ μ ES6μ λ©μλ μΆμ½ ννμΌλ‘ μ μλ ν¨μλ§[[HomeObject]]
λ₯Ό κ°λλ€λ κ²μ΄λ€.
const obj = {
// fooλ ES6μ λ©μλ μΆμ½ ννμΌλ‘ μ μν λ©μλλ€. λ°λΌμ [[HomeObject]]λ₯Ό κ°λλ€.
foo() {},
// barλ ES6μ λ©μλ μΆμ½ ννμΌλ‘ μ μν λ©μλκ° μλλΌ μΌλ° ν¨μλ€.
// λ°λΌμ [[HomeObject]]λ₯Ό κ°μ§ μλλ€.
bar: function () {}
};
superμ°Έμ‘°
λ κ°μ²΄ 리ν°λ΄μμλ ν μ μλ€.(λ¨, ES6μ λ©μλ μΆμ½ννμΌλ‘ μ μλ ν¨μλ§ κ°λ₯νλ€.)
const base = {
name: 'Lee',
sayHi() {
return `Hi! ${this.name}`;
}
};
const derived = {
__proto__: base,
// ES6 λ©μλ μΆμ½ ννμΌλ‘ μ μν λ©μλλ€. λ°λΌμ [[HomeObject]]λ₯Ό κ°λλ€.
sayHi() {
return `${super.sayHi()}. how are you doing?`;
}
};
console.log(derived.sayHi()); // Hi! Lee. how are you doing?
μλΈν΄λμ€μ μ μ λ©μλ λ΄μμ
super.sayHi
λ μνΌν΄λμ€μ μ μ λ©μλsayHi
λ₯Ό κ°λ¦¬ν¨λ€.
// μνΌν΄λμ€
class Base {
static sayHi() {
return 'Hi!';
}
}
// μλΈν΄λμ€
class Derived extends Base {
static sayHi() {
// super.sayHiλ μνΌν΄λμ€μ μ μ λ©μλλ₯Ό κ°λ¦¬ν¨λ€.
return `${super.sayHi()} how are you doing?`;
}
}
console.log(Derived.sayHi()); // Hi! how are you doing?
μμ κ΄κ³μ μλ λ
ν΄λμ€
κ° μ΄λ»κ² νλ ₯νλ©° μΈμ€ν΄μ€λ₯Ό μμ±νλμ§ μ΄ν΄λ³΄λλ‘ νμ
// μνΌν΄λμ€
class Rectangle {
construcotor(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 {
construcotor(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
super
νΈμΆμλ°μ€ν¬λ¦½νΈ μμ§μ
ν΄λμ€
λ₯Ό νκ°ν λ μνΌν΄λμ€μ μλΈν΄λμ€λ₯Ό ꡬλΆνκΈ° μν΄base
λλderived
λ₯Ό κ°μΌλ‘ κ°λ λ΄λΆ μ¬λ‘―[[ConstructorKind]]
λ₯Ό κ°λλ€.
μλΈν΄λμ€λ μμ μ΄ μ§μ μΈμ€ν΄μ€λ₯Ό μμ±νμ§ μκ³ μνΌν΄λμ€μκ² μΈμ€ν΄μ€ μμ±μ μμνλ€. μ΄κ²μ΄ λ°λ‘ μλΈν΄λμ€μconstructor
μμ λ°λμsuper
λ₯Ό νΈμΆν΄μΌ νλ μ΄μ λ€.
μλΈν΄λμ€κ°new
μ°μ°μμ ν¨κ» νΈμΆλλ©΄ μλΈν΄λμ€constructor
λ΄λΆμsuper
ν€μλκ° ν¨μμ²λΌ νΈμΆλλ€.(μνΌν΄λμ€κ° νκ°λμ΄ μμ±λ ν¨μ κ°μ²΄μ μ½λκ° μ€νλκΈ° μμνλ€.)
μλΈν΄λμ€constructor
λ΄λΆμsuper
νΈμΆμ΄ μμΌλ©΄ μλ¬κ° λ°μνλ€.
this
λ°μΈλ©μνΌν΄λμ€μ
constructor
λ΄λΆμ μ½λκ° μ€νλκΈ° μ΄μ μ μ묡μ μΌλ‘ λΉ κ°μ²΄λ₯Ό μμ±νλ€. μ΄ λΉ κ°μ²΄κ° λ°λ‘(μμ§ μλμ§λ μμμ§λ§) ν΄λμ€κ° μμ±ν μΈμ€ν΄μ€λ€.
μ묡μ μΌλ‘ μμ±λ λΉ κ°μ²΄, μ¦ μΈμ€ν΄μ€λthis
μ λ°μΈλ©λλ€. λ°λΌμ μνΌν΄λμ€μconstructor
λ΄λΆμthis
λ μμ±λ μΈμ€ν΄μ€λ₯Ό κ°λ¦¬ν¨λ€.
// μνΌν΄λμ€
class Rectangle {
constructor(width, height) {
// μ묡μ μΌλ‘ λΉ κ°μ²΄, μ¦ μΈμ€ν΄μ€κ° μμ±λκ³ thisμ λ°μΈλ©λλ€.
console.log(this); // ColorRectangle {}
// new μ°μ°μμ ν¨κ» νΈμΆν ν¨μ, μ¦ new.targetμ ColorRectangleμ΄λ€.
console.log(new.target); // ColorRectangle
// μμ±λ μΈμ€ν΄μ€μ νλ‘ν νμ
μΌλ‘ ColorRectangle.prototypeμ΄ μ€μ λλ€.
console.log(Object.getPrototypeOf(this) === ColorRectangle.prototype); // true
console.log(this instanceof ColorRectangle); // true
console.log(this instanceof Rectangle); // true
}
μΈμ€ν΄μ€ μνΌν΄λμ€κ° μμ±ν κ². νμ§λ§
new
μ°μ°μμ ν¨κ» νΈμΆλ ν΄λμ€κ° μλΈν΄λμ€λΌλ κ²μ΄ μ€μ.
new.target
μ μλΈν΄λμ€λ₯Ό κ°λ¦¬ν¨λ€. λ°λΌμ μΈμ€ν΄μ€λnew.target
μ΄ κ°λ¦¬ν€λ μλΈν΄λμ€κ° μμ±ν κ²μΌλ‘ μ²λ¦¬λλ€.
μμ±λ μΈμ€ν΄μ€μ νλ‘ν νμ μ μλΈν΄λμ€μ prototype νλ‘νΌν°κ° κ°λ¦¬ν€λ κ°μ²΄(Colorrectangle.prototype)λ€.
μνΌν΄λμ€μ
constructor
κ° μ€νthis
μ λ°μΈλ©λμ΄ μλ μΈμ€ν΄μ€λ₯Ό μ΄κΈ°ν.
// μνΌν΄λμ€
class Rectangle {
constructor(width, height) {
// μ묡μ μΌλ‘ λΉ κ°μ²΄, μ¦ μΈμ€ν΄μ€κ° μμ±λκ³ thisμ λ°μΈλ©λλ€.
console.log(this); // ColorRectangle {}
// new μ°μ°μμ ν¨κ» νΈμΆλ ν¨μ, μ¦ new.targetμ ColorRectangleμ΄λ€.
console.log(new.target); // ColorRectangle
// μμ±λ μΈμ€ν΄μ€μ νλ‘ν νμ
μΌλ‘ ColorRectangle.prototypeμ΄ μ€μ λλ€.
console.log(Object.getPrototypeOf(this) === ColorRectangle.prototype); // true
console.log(this instanceof ColorRectangle); // true
console.log(this instanceof Rectangle); // true
// μΈμ€ν΄μ€ μ΄κΈ°ν
this.widht = width;
this.height = height;
console.log(this); // ColorRectangle {width:2, height:4}
constructor
λ‘μ 볡κ·μ this
λ°μΈλ©
super
νΈμΆμ΄ μ’ λ£λκ³ μ μ΄ νλ¦μ΄ μλΈν΄λμ€constructor
λ‘ λμμ¨λ€.
μ΄λsuper
κ° λ°νν μΈμ€ν΄μ€κ°this
μ λ°μΈλ© μλΈν΄λμ€λ λ³λμ μΈμ€ν΄μ€ μμ±νμ§ μμ.
// μλΈν΄λμ€
class ColorRectangle extends Rectangle {
constructor(width, height, color) {
super(width, height);
// superκ° λ°νν μΈμ€ν΄μ€κ° thisμ λ°μΈλ©λλ€.
console.log(this); // ColorRectangle {widht: 2, height: 4}
μ΄ μ²λΌ
super
κ° νΈμΆλμ§ μμΌλ©΄ μΈμ€ν΄μ€κ° μμ±λμ§ μμΌλ©°,this
λ λ°μΈλ© ν μ μλ€. μλΈν΄λμ€μconstructor
μμsuper
λ₯Ό νΈμΆνκΈ° μ μλthis
λ₯Ό μ°Έμ‘°ν μ μλ μ΄μ κ° λ°λ‘ μ΄ λλ¬Έμ΄λ€.
super
νΈμΆ μ΄ν, μλΈν΄λμ€μconstructor
μ κΈ°μ λμ΄ μλ μΈμ€ν΄μ€ μ΄κΈ°ν
ν΄λμ€μ λͺ¨λ μ²λ¦¬κ° λλλ©΄ μμ±λ μΈμ€ν΄μ€κ° λ°μΈλ©λ
this
κ° μ묡μ μΌλ‘ λ°ν.
// μλΈν΄λμ€
class ColorRectangle extends Rectangle {
constructor(width, height, color) {
super(width, height);
// superκ° λ°νν μΈμ€ν΄μ€κ° thisμ λ°μΈλ©λλ€.
console.log(this); // ColorRectangle {width: 2, height: 4}
// μΈμ€ν΄μ€ μ΄κΈ°ν
this.color = color;
// μμ±λ μΈμ€ν΄μ€κ° λ°μΈλ©λ thisκ° μ묡μ μΌλ‘ λ°νλλ€.
console.log(this); // ColorRectangle {width: 2, height: 4, color: "red"}
}
...
extends
ν€μλ λ€μμλ ν΄λμ€ λΏλ§ μλλΌ[[Construct]]
λ΄λΆ λ©μλλ₯Ό κ°λ ν¨μ κ°μ²΄λ‘ νκ° λ μ μλ λͺ¨λ ννμ μ¬μ© κ°λ₯.
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.unip νΈμΆ
console.log(myArray.uniq()); // MyArray(4) [1, 2, 3]
// MyArray.prootype.average νΈμΆ
console.log(myArray.average()); // 1.75
Array μμ±μ ν¨μ
λ₯Ό μμλ°μ νμ₯νMyArray
ν΄λμ€κ° μμ±ν μΈμ€ν΄μ€λArray.prototype
κ³ΌMyArray.prototype
μ λͺ¨λ λ©μλλ₯Ό μ¬μ©ν μ μλ€.
μ£Όμν κ²μArrray.prototype
μ λ©μλ μ€μmap
filter
μ κ°μ΄ μλ‘μ΄ λ°°μ΄μ λ°ννλ λ©μλκ°MyArray
ν΄λμ€μ μΈμ€ν΄μ€λ₯Ό λ°ννλ€λ κ².
console.log(myArray.filter(v => v % 2) instanceof MyArray); // true
λ§μ½ μλ‘μ΄ λ°°μ΄μ λ°ννλ 맀μλκ°
MyArray
ν΄λμ€μ μΈμ€ν΄μ€λ₯Ό λ°ννμ§ μκ³Array
μ μΈμ€ν΄μ€λ₯Ό λ°ννλ©΄MyArray
ν΄λμ€μ λ©μλμ λ©μλ체μ΄λμ΄ λΆκ°λ₯νλ€.
λ©μλκ° κ°μ²΄λ₯Ό λ°ννκ² λλ©΄ λ©μλμ λ°ν κ°μΈ κ°μ²΄λ₯Ό ν΅ν΄ λ λ€λ₯Έ ν¨μλ₯Ό νΈμΆν μ μλ€. μ΄λ¬ν νλ‘κ·Έλλ° ν¨ν΄μ
λ©μλ 체μ΄λ(Method Chaining)
μ΄λΌ λΆλ₯Έλ€.
// λ©μλ 체μ΄λ
// [1, 1, 2, 3] => [1, 1, 3] => [1, 3] => 2
console.log(myArray.filter(v => v%2).uniq().average()); // 2
λ§μ½
MyArray
ν΄λμ€μuniq
λ©μλκ°MyArray
ν΄λμ€κ° μμ±ν μΈμ€ν΄κ° μλArray
κ° μμ±ν μΈμ€ν΄μ€λ₯Ό λ°ννκ² νλ €λ©΄ λ€μκ³Ό κ°μ΄Symbol.species
λ₯Ό μ¬μ©νμ¬μ μ μ κ·Όμ νλ‘νΌν°
λ₯Ό μΆκ°νλ€.
// Array μμ±μ ν¨μλ₯Ό μμλ°μ νμ₯ν MyArray
class MyArray extends Array {
// λͺ¨λ λ©μλκ° Array νμ
μ μΈμ€ν΄μ€λ₯Ό λ°ννλλ‘ νλ€.
static get [Symbol.species]() { return 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) => prec + cur, 0) / this.length;
}
}
const myArray = new MyArray(1, 1, 2, 3);
console.log(myArray.uniq() instanceof MyArray); // false
console.log(myArray.uniq() instanceof Array); // true
// λ©μλ 체μ΄λ
// uniq λ©μλλ Array μΈμ€ν΄μ€λ₯Ό λ°ννλ―λ‘ average λ©μλλ₯Ό νΈμΆν μ μλ€.
console.log(myArray.uniq().average());
// TypeError: myArray.uniq(...).average is not a function