new
μ°μ°μμ ν¨κ» object μμ±μ ν¨μλ₯Ό νΈμΆνλ©΄ λΉ κ°μ²΄λ₯Ό μμ±νμ¬ λ°ννλ€. λΉ κ°μ²΄λ₯Ό μμ±ν μ΄ν νλ‘νΌν° λλ λ©μλλ₯Ό μΆκ°νμ¬ κ°μ²΄λ₯Ό μμ±ν μ μλ€. μμ±μ ν¨μμ μν΄ μμ±λ κ°μ²΄λ₯Ό μΈμ€ν΄μ€(instance)λΌκ³ νλ€.
// λΉ κ°μ²΄μ μμ±
const person = new Object();
// νλ‘νΌν° μΆκ°
person.name = 'Lee';
person.sayHello = function () {
console.log('Hi! My name is ' + this.name);
};
console.log(person); // {name: "Lee", sayHello: Ζ}
person.sayHello(); // Hi! My name is Lee
μλ°μ€ν¬λ¦½νΈλ Object μμ±μ ν¨μ μ΄μΈμλ String, Number, Boolean, Function, Array, Date, RegExp, Promise λ±μ λΉνΈμ΄ μμ±μ ν¨μλ₯Ό μ 곡νλ€.
κ°μ²΄ 리ν°λ΄μ μν κ°μ²΄ μμ± λ°©μμ λ¨ νλμ κ°μ²΄λ§ μμ±νλ€. λ°λΌμ λμΌν νλ‘νΌν°λ₯Ό κ°λ κ°μ²΄λ₯Ό μ¬λ¬ κ° μμ±ν΄μΌ νλ κ²½μ° λ§€λ² κ°μ νλ‘νΌν°λ₯Ό κΈ°μ ν΄μΌ νκΈ° λλ¬Έμ λΉν¨μ¨μ μ΄λ€.
μμ±μ ν¨μμ μν κ°μ²΄ μμ± λ°©μμ λ§μΉ κ°μ²΄(μΈμ€ν΄μ€)λ₯Ό μμ±νκΈ° μν ν νλ¦Ώ(ν΄λμ€)μ²λΌ μμ±μ ν¨μλ₯Ό μ¬μ©νμ¬ νλ‘νΌν° κ΅¬μ‘°κ° λμΌν κ°μ²΄ μ¬λ¬κ°λ₯Ό κ°νΈνκ² μμ±ν μ μλ€.
μμ±μ ν¨μλ μ΄λ¦ κ·Έλλ‘ κ°μ²΄(μΈμ€ν΄μ€)λ₯Ό μμ±νλ ν¨μμ΄λ€. μΌλ° ν¨μμ λμΌν λ°©λ²μΌλ‘ μμ±μ ν¨μλ₯Ό μ μνκ³ new μ°μ°μμ ν¨κ» νΈμΆνλ©΄ ν΄λΉ ν¨μλ μμ±μ ν¨μλ‘ λμνλ€.
π§ this
thisλ κ°μ²΄ μμ μ νλ‘νΌν°λ λ©μλλ₯Ό μ°Έμ‘°νκΈ° μν μκΈ° μ°Έμ‘° λ³μλ€. thisκ° κ°λ¦¬ν€λ κ°, μ¦ thisλ°μΈλ©μ ν¨μ νΈμΆ λ°©μμ λ°λΌ λμ μΌλ‘ κ²°μ λλ€.
new μ°μ°μμ ν¨κ» μμ±μ ν¨μλ₯Ό νΈμΆνλ©΄ μλ°μ€ν¬λ¦½νΈ μμ§μ λ€μκ³Ό κ°μ κ³Όμ μ κ±°μ³ μ묡μ μΌλ‘ μΈμ€ν΄μ€λ₯Ό μμ±νκ³ μΈμ€ν΄μ€λ₯Ό μ΄κΈ°νν ν μ묡μ μΌλ‘ μΈμ€ν΄μ€λ₯Ό λ°ννλ€.
π§ λ°μΈλ©?
λ°μΈλ©μ΄λ μλ³μμ κ°μ μ°κ²°νλ κ³Όμ μ μλ―Ένλ€. μλ₯Όλ€μ΄, λ³μ μ μΈμ λ³μ μ΄λ¦(μλ³μ)κ³Ό ν보λ λ©λͺ¨λ¦¬ 곡κ°μ μ£Όμλ₯Ό λ°μΈλ© νλ κ²μ΄λ€. this λ°μΈλ©μ this(ν€μλλ‘ λΆλ₯λμ§λ§ μλ³μ μν μ νλ€)μ thisκ° κ°λ¦¬ν¬ κ°μ²΄λ₯Ό λ°μΈλ©νλ κ²μ΄λ€.
[[Call]]
κ³Ό [[Construct]]
ν¨μλ κ°μ²΄μ΄λ―λ‘ μΌλ° κ°μ²΄μ λμΌνκ² λμν μ μλ€. νμ§λ§ μΌλ° κ°μ²΄μλ λ€λ₯΄λ€. μΌλ° κ°μ²΄λ νΈμΆν μ μμ§λ§ ν¨μλ νΈμΆν μ μλ€. ν¨μ κ°μ²΄λ [[Environment]]
, [[FormalParameters]]
λ±μ λ΄λΆ μ¬λ‘―κ³Ό, [[Call]]
κ³Ό [[Construct]]
κ°μ λ΄λΆ λ©μλλ₯Ό μΆκ°λ‘ κ°μ§κ³ μκΈ° λλ¬Έμ΄λ€.
function foo() {}
// μΌλ°μ μΈ ν¨μλ‘μ νΈμΆ: [[Call]]μ΄ νΈμΆλλ€.
foo();
// μμ±μ ν¨μλ‘μ νΈμΆ: [[Construct]]κ° νΈμΆλλ€.
new foo();
λ΄λΆ λ©μλ [[Call]]
μ κ°λ ν¨μ κ°μ²΄λ₯Ό callableμ΄λΌκ³ νλ©°, λ΄λΆ λ©μλ[[Construct]]
λ₯Ό κ°λ ν¨μ κ°μ²΄λ₯Ό constructor, [[Construct]]
λ₯Ό κ°μ§ μλ ν¨μ κ°μ²΄λ₯Ό non-constructorλΌκ³ λΆλ₯Έλ€.
κ²°λ‘ μ μΌλ‘ ν¨μ κ°μ²΄λ callableμ΄λ©΄μ constructorμ΄κ±°λ callableμ΄λ©΄μ non-constructorλ€. μ¦ λͺ¨λ ν¨μ κ°μ²΄λ νΈμΆν μ μμ§λ§ λͺ¨λ ν¨μ κ°μ²΄λ₯Ό μμ±μ ν¨μλ‘μ νΈμΆν μ μλκ²μ μλλ€.
ECMAScript μ¬μμμ λ©μλλ ES6 λ©μλ μΆμ½ ννλ§μ μλ―Ένλ€. λ€μ λ§ν΄ ν¨μκ° μ΄λμ ν λΉλμ΄ μλμ§μ λ°λΌ λ©μλμΈμ§λ₯Ό νλ¨νλ κ²μ΄ μλλΌ ν¨μ μ μ λ°©μμ λ°λΌ constructorκ³Ό non-constructorλ₯Ό ꡬλΆνλ€.
new μ°μ°μμ ν¨κ» ν¨μλ₯Ό νΈμΆνλ©΄ [[Call]]
μ΄ νΈμΆλλ κ²μ΄ μλλΌ [[Construct]]
κ° νΈμΆλλ€.
μΌλ° ν¨μμ μμ±μ ν¨μμ νΉλ³ν νμμ μ°¨μ΄λ μκΈ° λλ¬Έμ, μμ±μ ν¨μλ μΌλ°μ μΌλ‘ 첫 λ¬Έμλ₯Ό λλ¬Έμλ‘ κΈ°μ νλ νμ€μΉΌ μΌμ΄μ€λ‘ λͺ λͺ νμ¬ μΌλ° ν¨μμ ꡬλ³ν μ μλλ‘ νλ€.
new.targetμ this μ μ μ¬νκ² constructorμΈ λͺ¨λ ν¨μ λ΄λΆμμ μ묡μ μΈ μ§μ λ³μμ κ°μ΄ μ¬μ©λλ©° λ©ν νλ‘νΌν°λΌκ³ λΆλ₯Έλ€. ν¨μ λ΄λΆμμ new.targetμ μ¬μ©νλ©΄ new μ°μ°μμ ν¨κ» μμ±μ ν¨μλ‘μ νΈμΆλμλμ§ νμΈν μ μλ€.
new μ°μ°μμ ν¨κ» μμ±μ ν¨μλ‘μ νΈμΆλλ©΄ ν¨μ λ΄λΆμ new.targetμ ν¨μ μμ μ κ°λ¦¬ν¨λ€. new μ°μ°μ μμ΄ μΌλ° ν¨μλ‘μ νΈμΆλ ν¨μ λ΄λΆμ new.targetμ undefinedλ€.
// μμ±μ ν¨μ
function Circle(radius) {
// μ΄ ν¨μκ° new μ°μ°μμ ν¨κ» νΈμΆλμ§ μμλ€λ©΄ new.targetμ undefinedλ€.
if (!new.target) {
// new μ°μ°μμ ν¨κ» μμ±μ ν¨μλ₯Ό μ¬κ· νΈμΆνμ¬ μμ±λ μΈμ€ν΄μ€λ₯Ό λ°ννλ€.
return new Circle(radius);
}
this.radius = radius;
this.getDiameter = function () {
return 2 * this.radius;
};
}
// new μ°μ°μ μμ΄ μμ±μ ν¨μλ₯Ό νΈμΆνμ¬λ new.targetμ ν΅ν΄ μμ±μ ν¨μλ‘μ νΈμΆλλ€.
const circle = Circle(5);
console.log(circle.getDiameter());