[JavaScript] 15. μμ±μ ν¨μμ μν κ°μ²΄ μμ±
π λͺ¨λ μλ°μ€ν¬λ¦½νΈ κ΅μ¬) 17μ₯. μμ±μ ν¨μμ μν κ°μ²΄ μμ±
λ€μν κ°μ²΄ μμ± λ°©μ μ€, μμ±μ ν¨μλ₯Ό μ¬μ©νμ¬ κ°μ²΄λ₯Ό μμ±νλ λ°©μμ μ΄ν΄λ³΄λλ‘ νμ.
01. Object μμ±μ ν¨μ
new μ°μ°μμ ν¨κ» Object μμ±μ ν¨μλ₯Ό νΈμΆνλ©΄ λΉ κ°μ²΄λ₯Ό μμ±νμ¬ λ°ννλ€.
λΉ κ°μ²΄λ₯Ό μμ±ν μ΄ν νλ‘νΌν° λλ λ©μλλ₯Ό μΆκ°νμ¬ κ°μ²΄λ₯Ό μμ±ν μ μλ€.
π₯οΈ μμ μ½λ
// λΉ κ°μ²΄μ μμ±
const person = new Object();
// νλ‘νΌν° μΆκ°
person.name = 'Lee';
person.sayHello = function() {
console.log('Hi! My name is ' + this.name);
};
console.log(person); // {name: "Lee", sayHello: f}
person.sayHello(); // Hi! My name is Lee
β οΈ λ°λμ Object μμ±μ ν¨μλ₯Ό μ¬μ©ν΄ λΉ κ°μ²΄λ₯Ό μμ±ν΄μΌ νλ κ²μ μλλ€. κ°μ²΄λ₯Ό μμ±νλ λ°©λ²μ κ°μ²΄ 리ν°λ΄μ μ¬μ©νλ κ²μ΄ λ κ°νΈνλ€!
02. μμ±μ ν¨μ
μμ±μ ν¨μλ new μ°μ°μμ ν¨κ» νΈμΆνμ¬ κ°μ²΄(μΈμ€ν΄μ€)λ₯Ό μμ±νλ ν¨μλ₯Ό λ§νλ€.
μμ±μ ν¨μμ μν΄ μμ±λ κ°μ²΄λ₯Ό μΈμ€ν΄μ€λΌκ³ νλ€.
1) κ°μ²΄ 리ν°λ΄μ μν κ°μ²΄ μμ± λ°©μμ λ¬Έμ μ
κ°μ²΄ 리ν°λ΄μ μν κ°μ²΄ μμ± λ°©μμ λ¨ νλμ κ°μ²΄λ§ μμ±νλ€.
β‘οΈ μ΄λ λμΌν νλ‘νΌν°λ₯Ό κ°λ κ°μ²΄λ₯Ό μ¬λ¬ κ° μμ±ν΄μΌ νλ κ²½μ°, λΉν¨μ¨μ μ΄λ€.
β‘οΈ νλ‘νΌν° κ΅¬μ‘°κ° λμΌν¨μλ λΆκ΅¬νκ³ , λ§€λ² κ°μ νλ‘νΌν°μ λ©μλλ₯Ό κΈ°μ ν΄μΌ νλ€.
2) μμ±μ ν¨μμ μν κ°μ²΄ μμ± λ°©μμ μ₯μ
μμ±μ ν¨μμ μν κ°μ²΄ μμ± λ°©μμ λ§μΉ κ°μ²΄(μΈμ€ν΄μ€)λ₯Ό μμ±νκΈ° μν ν νλ¦Ώ(ν΄λμ€)μ²λΌ μμ±μ ν¨μλ₯Ό μ¬μ©νμ¬, νλ‘νΌν° κ΅¬μ‘°κ° λμΌν κ°μ²΄ μ¬λ¬ κ°λ₯Ό κ°νΈνκ² μμ±ν μ μλ€.
π₯οΈ μμ μ½λ
// μμ±μ ν¨μ
function Circle(radius) {
// μμ±μ ν¨μ λ΄λΆμ thisλ μμ±μ ν¨μκ° μμ±ν μΈμ€ν΄μ€λ₯Ό κ°λ¦¬ν¨λ€.
this.radius = radius;
this.getDiameter = function() {
return 2 * this.radius;
};
}
// μΈμ€ν΄μ€μ μμ±
const circle1 = new Circle(5); // λ°μ§λ¦μ΄ 5μΈ Circle κ°μ²΄λ₯Ό μμ±
const circle2 = new Circle(10); // λ°μ§λ¦μ΄ 10μΈ Circle κ°μ²΄λ₯Ό μμ±
console.log(circle1.getDiameter()); // 10
console.log(circle2.getDiameter()); // 20
3) μμ±μ ν¨μμ μΈμ€ν΄μ€ μμ± κ³Όμ
μμ±μ ν¨μμ ν¨μ λͺΈμ²΄μμ μνν΄μΌ νλ κ²μ μμ보λλ‘ νμ.
μμ±μ ν¨μλ νλ‘νΌν° κ΅¬μ‘°κ° λμΌν μΈμ€ν΄μ€λ₯Ό μμ±νκΈ° μν ν νλ¦Ώ(ν΄λμ€)μΌλ‘μ λμνμ¬
μΈμ€ν΄μ€λ₯Ό μμ±νκ³ , μμ±λ μΈμ€ν΄μ€λ₯Ό μ΄κΈ°ν(μΈμ€ν΄μ€ νλ‘νΌν° μΆκ° λ° μ΄κΈ°κ° ν λΉ)νλ€.
1. μΈμ€ν΄μ€ μμ±κ³Ό this λ°μΈλ©
μ묡μ μΌλ‘ λΉ κ°μ²΄κ° μμ±λκ³ , μ΄ λΉ κ°μ²΄λ μμ±μ ν¨μκ° μμ±ν μΈμ€ν΄μ€λ€.
μ΄ μΈμ€ν΄μ€λ thisμ λ°μΈλ©λλ€.
β» λ°μΈλ©μ΄λ?
μλ³μμ κ°μ μ°κ²°νλ κ³Όμ μ μλ―Ένλ€.
π₯οΈ μμ μ½λ
function Circle(radius) {
// 1. μ묡μ μΌλ‘ μΈμ€ν΄μ€κ° μμ±λκ³ thisμ λ°μΈλ©λλ€.
console.log(this); // Circle {}
this.radius = radius;
this.getDiameter = function() {
return 2 * this.radius;
};
}
2. μΈμ€ν΄μ€ μ΄κΈ°ν
thisμ λ°μΈλ©λμ΄ μλ μΈμ€ν΄μ€λ₯Ό μ΄κΈ°ννλ€.
μ¦, μΈμ€ν΄μ€μ νλ‘νΌν°λ λ©μλλ₯Ό μΆκ°νκ³ , μμ±μ ν¨μκ° μΈμλ‘ μ λ¬λ°μ μ΄κΈ°κ°μ μΈμ€ν΄μ€ νλ‘νΌν°μ ν λΉνμ¬ μ΄κΈ°ννκ±°λ κ³ μ κ°μ ν λΉνλ€.
π₯οΈ μμ μ½λ
function Circle(radius) {
// 1. μ묡μ μΌλ‘ μΈμ€ν΄μ€κ° μμ±λκ³ thisμ λ°μΈλ©λλ€.
// 2. thisμ λ°μΈλ©λμ΄ μλ μΈμ€ν΄μ€λ₯Ό μ΄κΈ°ννλ€.
this.radius = radius;
this.getDiameter = function() {
return 2 * this.radius;
};
}
3. μΈμ€ν΄μ€ λ°ν
μμ±μ ν¨μ λ΄λΆμμ λͺ¨λ μ²λ¦¬κ° λλλ©΄ μμ±λ μΈμ€ν΄μ€κ° λ°μΈλ©λ thisλ₯Ό μ묡μ μΌλ‘ λ°ννλ€.
π₯οΈ μμ μ½λ
function Circle(radius) {
// 1. μ묡μ μΌλ‘ μΈμ€ν΄μ€κ° μμ±λκ³ thisμ λ°μΈλ©λλ€.
// 2. thisμ λ°μΈλ©λμ΄ μλ μΈμ€ν΄μ€λ₯Ό μ΄κΈ°ννλ€.
this.radius = radius;
this.getDiameter = function() {
return 2 * this.radius;
};
// 3. μμ±λ μΈμ€ν΄μ€κ° λ°μΈλ©λ thisκ° μ묡μ μΌλ‘ λ°νλλ€.
}
// μΈμ€ν΄μ€ μμ±. Circle μμ±μ ν¨μλ μ묡μ μΌλ‘ thisλ₯Ό λ°ννλ€.
const circle = new Circle(1);
console.log(circle); // Circle {radius: 1, getDiameter: f}
β οΈ μμ±μ ν¨μ λ΄λΆμμ return λ¬Έμ λ°λμ μλ΅ν΄μΌ νλ€!
β‘οΈ μμ±μ ν¨μ λ΄λΆμμ thisκ° μλ λ€λ₯Έ κ°μ λ°ννλ κ²μ μμ±μ ν¨μμ κΈ°λ³Έ λμμ νΌμνκΈ° λλ¬Έμ΄λ€.
4) λ΄λΆ λ©μλ [[Call]]κ³Ό [[Construct]]
ν¨μλ κ°μ²΄μ΄μ§λ§ νΈμΆν μ μλ€λ μ μμ μΌλ° κ°μ²΄μ λ€λ₯΄λ€.
β‘οΈ λ°λΌμ, [[Call]], [[Construct]] κ°μ λ΄λΆ λ©μλλ₯Ό μΆκ°λ‘ κ°μ§κ³ μλ€.
- ν¨μκ° μΌλ° ν¨μλ‘μ νΈμΆ β‘οΈ ν¨μ κ°μ²΄μ λ΄λΆ λ©μλ [[Call]]μ΄ νΈμΆ
- ν¨μκ° new μ°μ°μμ ν¨κ² μμ±μ ν¨μλ‘μ νΈμΆ β‘οΈ λ΄λΆ λ©μλ [[Construct]]κ° νΈμΆ
5) constructorμ non-constructorμ ꡬλΆ
construct : [[Construct]]λ₯Ό κ°λ ν¨μ κ°μ²΄
non-construct : [[Construct]]λ₯Ό κ°μ§ μλ ν¨μ κ°μ²΄
μλ°μ€ν¬λ¦½νΈ μμ§μ ν¨μ κ°μ²΄λ₯Ό μμ±ν λ, ν¨μ μ μ λ°©μμ λ°λΌ μ΄ λμ ꡬλΆνλ€.
construct : ν¨μ μ μΈλ¬Έ, ν¨μ ννμ, ν΄λμ€(ν΄λμ€λ ν¨μ!)
non-construnct : λ©μλ(ES6 λ©μλ μΆμ½ νν), νμ΄ν ν¨μ
β οΈ μμ±μ ν¨μλ‘μ νΈμΆλ κ²μ κΈ°λνκ³ μ μνμ§ μμ μΌλ° ν¨μ(callableμ΄λ©΄μ constructor)μ new μ°μ°μλ₯Ό λΆμ¬ νΈμΆνλ©΄ μμ±μ ν¨μμ²λΌ λμν μ μλ€.
6) new μ°μ°μ
μΌλ° ν¨μμ μμ±μ ν¨μμ νΉλ³ν νμμ μ°¨μ΄λ μλ€.
new μ°μ°μμ ν¨κ» νΈμΆνλ©΄ ν΄λΉ ν¨μλ μμ±μ ν¨μλ‘ λμνλ€.
π₯οΈ μμ μ½λ
// μμ±μ ν¨μλ‘μ μ μνμ§ μμ μΌλ° ν¨μ
function add(x, y) {
return x + y;
}
// μμ±μ ν¨μλ‘μ μ μνμ§ μμ μΌλ° ν¨μλ₯Ό new μ°μ°μμ ν¨κ» νΈμΆ
let inst = new add();
// ν¨μκ° κ°μ²΄λ₯Ό λ°ννμ§ μμμΌλ―λ‘ λ°νλ¬Έμ΄ λ¬΄μλλ€.
// λ°λΌμ λΉ κ°μ²΄κ° μμ±λμ΄ λ°νλλ€.
console.log(inst); // {}
// κ°μ²΄λ₯Ό λ°ννλ μΌλ° ν¨μ
function createUser(name, role) {
return { name, role };
}
// μΌλ° ν¨μλ₯Ό new μ°μ°μμ ν¨κ» νΈμΆ
inst = new createUser('Lee', 'admin');
// ν¨μκ° μμ±ν κ°μ²΄λ₯Ό λ°ννλ€.
console.log(inst); // {name: "Lee", role: "admin"}
new μ°μ°μ μμ΄ μμ±μ ν¨μλ₯Ό νΈμΆνλ©΄ μΌλ° ν¨μλ‘ νΈμΆλλ€.
π₯οΈ μμ μ½λ
// μμ±μ ν¨μ
function Circle(radius) {
this.radius = radius;
this.getDiameter = function() {
return 2 * this.radius;
};
}
// new μ°μ°μ μμ΄ μμ±μ ν¨μ νΈμΆνλ©΄ μΌλ° ν¨μλ‘μ νΈμΆλλ€.
const circle = Circle(5);
console.log(circle); // undefined
β οΈ μΌλ° ν¨μμ μμ±μ ν¨μμ νΉλ³ν μ°¨μ΄κ° μλ€.
β‘οΈ λ°λΌμ μμ±μ ν¨μλ μΌλ°μ μΌλ‘ 첫 λ¬Έμλ₯Ό λλ¬Έμλ‘ κΈ°μ νλ νμ€μΉΌ μΌμ΄μ€λ‘ λͺ λͺ νμ¬ μΌλ° ν¨μμ ꡬλ³νλλ‘ νλ€.
7) new.target
μμ±μ ν¨μκ° new μ°μ°μ μμ΄ νΈμΆλλ κ²μ λ°©μ§νλλΌλ, μ€μκ° λ°μνλ κ²μ ννΌνκΈ° μν΄ ES6μμλ new.targetμ μ§μνλ€.
new.target.μ thisμ μ μ¬νκ² constructorμΈ λͺ¨λ ν¨μ λ΄λΆμμ μ묡μ μΈ μ§μ λ³μμ κ°μ΄ μ¬μ©λλ©° λ©ν νλ‘νΌν°λΌκ³ λΆλ₯Έλ€.
new μ°μ°μμ ν¨κ» μμ±μ ν¨μλ‘μ νΈμΆλλ©΄ ν¨μ λ΄λΆμ new.targetμ ν¨μ μμ μ κ°λ¦¬ν¨λ€.
π μ°Έκ³ μλ£