β κ°μ²΄ μμ± λ°©μμ κ°μ²΄ 리ν°λ΄μ μν μμ± λ°©μλ μμ§λ§, λ€μν λ€λ₯Έ λ°©μλ μλ€.
β λ€μν κ°μ²΄ μμ± λ°©μ μ€μ μμ±μ ν¨μλ₯Ό μ¬μ©νμ¬ κ°μ²΄λ₯Ό μμ±νλ λ°©μμ μ΄ν΄λ³΄κ³ κ°μ²΄ 리ν°λ΄ κ°μ²΄ μμ± λ°©μκ³Ό μμ±μ ν¨μλ₯Ό μ¬μ©νμ¬ κ°μ²΄λ₯Ό μμ±νλ λ°©μμ μ₯λ¨μ μ μμλ³Έλ€.
new μ°μ°μ
μ ν¨κ»Object μμ±μ ν¨μ
λ₯Ό νΈμΆνλ©΄ λΉ κ°μ²΄λ₯Ό μμ±νμ¬ λ°ν. λΉ κ°μ²΄λ₯Ό μμ±ν μ΄ν νλ‘νΌν° λλ λ©μλλ₯Ό μΆκ°νμ¬ κ°μ²΄ μμ±
μλ°μ€ν¬λ¦½νΈλ Object μμ±μ ν¨μ μ΄μΈμλString
Number
Boolean
Function
Array
Date
RegExp
Promise
λ±μ λΉνΈμΈ μμ±μ ν¨μλ₯Ό μ 곡νλ€.
// λΉ κ°μ²΄μ μμ±
const person = new Object();
// νλ‘νΌν°μΆκ°
person.name = "noh";
person.sayHello = function() {
console.log("Hi! My name is" + this.name);
};
console.log(person) // {name: "noh", sayHello : f}
person.sayHello(); // Hi! My name is noh
// String μμ±μ ν¨μμ μν String κ°μ²΄ μμ±
const strObj = new String("Noh");
console.log(typeof strObj) // object
console.log(strObj) // String {"noh"}
// Number μμ±μ ν¨μμ μν Number κ°μ²΄ μμ±
const numObj = new Number(123);
console.log(typeof numObj) // object
console.log(numObj) // Number {123}
// Boolean μμ±μ ν¨μμ μν Boolean κ°μ²΄ μμ±
const boolObj = new Boolean(true);
console.log(typeof boolObj); // object
console.log(boolObj); //Boolean {true}
// Function μμ±μ ν¨μμ μν Function κ°μ²΄(ν¨μ) μμ±
const func = new Function ('x', "return x * x" );
console.log(typeof func);
console.dir(func);
// Array μμ±μ ν¨μμ μν Array κ°μ²΄(λ°°μ΄) μμ±
const arr = new Array(1,2,3)
console.log(typeof arr); // object
console.log(arr);
// RegExp μμ±μ ν¨μμ μν RegExp κ°μ²΄(μ κ· ννμ) μμ±
const regExp = new RegExp(/ab+c/i);
console.log(typeof regExp); // object
console.log(regExp); // /ab+c/i
// Date μμ±μ ν¨μμ μν Date κ°μ²΄ μμ±
console.log(typeof date); // object
console.log(date) /
π‘ μμ±μ ν¨μλ?
new μ°μ°μ
μ ν¨κ» νΈμΆνμ¬ κ°μ²΄(μΈμ€ν΄μ€
)λ₯Ό μμ±νλ ν¨μλ₯Ό λ§νλ€. μμ±μ ν¨μμ μν΄ μμ±λ κ°μ²΄λ₯ΌμΈμ€ν΄μ€
λΌ νλ€.
κ°μ²΄ 리ν°λ΄μ μν κ°μ²΄ μμ± λ°©μμ μ§κ΄μ μ΄κ³ κ°νΈνμ§λ§ λ¨ νλμ κ°μ²΄λ§ μμ±νλ€. λ°λΌμ λμΌν νλ‘νΌν°λ₯Ό κ°λ κ°μ²΄λ₯Ό μ¬λ¬κ° μμ±ν΄μΌ νλ κ²½μ° λΉν¨μ¨μ μ΄λ€.
const circle1 = {
radius : 5,
getDiameter() {
return 2 * this.radius;
}
};
console.log(circle1.getDiameter()); // 10
const circle2 = {
radius: 10,
getDiameter() { // κ°μ²΄ λ©μλ function μλ΅κ°λ₯ νλ‘νΌν°ν€ : getDiameter
return 2 * this.radius;
}
};
console.log(circle2.getDiameter());
μμ±μ ν¨μμ μν κ°μ²΄ μμ± λ°©μμ λ§μΉ κ°μ²΄(μΈμ€ν΄μ€)λ₯Ό μμ±νκΈ° μν ν νλ¦Ώ(ν΄λμ€)μ²λΌ μμ±μ ν¨μλ₯Ό μ¬μ©νμ¬ νλ‘νΌν° κ΅¬μ‘°κ° λμΌν κ°μ²΄ μ¬λ¬κ°λ₯Ό κ°νΈνκ² μμ±ν μ μλ€.
// μμ±μ ν¨μ
function Circle(radius) {
// μμ±μ ν¨μ λ΄λΆμ thisλ μμ±μ ν¨μκ° μμ±ν μΈμ€ν΄μ€λ₯Ό κ°λ¦¬ν¨λ€.
this.radius = radius;
this.getDiameter = function () {
return 2 * this.radius;
};
}
console.log(new Circle(5));
const circle1 = new Circle(5);
const circle2 = new Circle(10);
console.log(circle1.getDiameter()); // 10
console.log(circle2.getDiameter()); // 20
μμ±μ ν¨μ
λ μ΄λ¦ κ·Έλλ‘ κ°μ²΄(μΈμ€ν΄μ€)λ₯Ό μμ±νλ ν¨μnew μ°μ°μ
μ ν¨κ» νΈμΆνλ©΄ ν΄λΉ ν¨μλ μμ±μ ν¨μλ‘ λμ λ§μ½new μ°μ°μ
μ ν¨κ» μμ±μ ν¨μλ₯Ό νΈμΆνμ§ μμΌλ©΄ μμ±μ ν¨μκ° μλλΌ μΌλ°ν¨μλ‘ λμ.
// new μ°μ°μμ ν¨κ» νΈμΆνμ§ μμΌλ©΄ μμ±μ ν¨μλ‘ λμνμ§ μλλ€.
// μ¦, μΌλ° ν¨μλ‘ νΈμΆλλ€.
const circle3 = Circle(15);
// μΌλ° ν¨μλ‘μ νΈμΆλ Circleμ λ°νλ¬Έμ΄ μμΌλ―λ‘ undefinedλ₯Ό λ°ν.
console.log(circle3); // undefined
// μΌλ° ν¨μλ‘μ νΈμΆλ Circleλ΄μ thisλ μ μ κ°μ²΄λ₯Ό κ°λ¦¬ν¨λ€.
console.log(radius); // 15
μμ±μ ν¨μ
μ μν μ νλ‘νΌν° κ΅¬μ‘°κ° λμΌν μΈμ€ν΄μ€λ₯Ό μμ±νκΈ° μν ν νλ¦Ώ(ν΄λμ€)μΌλ‘μ λμνμ¬ μΈμ€ν΄μ€λ₯Ό μμ±νλ κ²κ³Ό μμ±λ μΈμ¨ν΄μ€λ₯Ό μ΄κΈ°ν(μΈμ€ν΄μ€ νλ‘νΌν° μΆκ° λ° μ΄κΈ°ν ν λΉ)νλ κ²μ΄λ€.
μλ°μ€ν¬λ¦½νΈ μμ§μ μ묡μ μΈ μ²λ¦¬λ₯Ό ν΅ν΄μΈμ€ν΄μ€
λ₯Ό μμ±νκ³ λ°ννλ€.new μ°μ°μ
μ ν¨κ»μμ±μ ν¨μ
λ₯Ό νΈμΆνλ©΄ μλ°μ€ν¬λ¦½νΈ μμ§μ λ€μκ³Ό κ°μ κ³Όμ μ κ±°μ³ μ묡μ μΌλ‘ μΈμ€ν΄μ€ μμ± λ° μ΄κΈ°νν ν μ묡μ μΌλ‘μΈμ€ν΄μ€
λ₯Ό λ°ννλ€.
μμ±μ ν¨μ
λ΄λΆμμ return λ¬Έμ λ°λμ μλ΅ν΄μΌ νλ€.
1. μΈμ€ν΄μ€ μμ±κ³Ό this λ°μΈλ©
this
μ λ°μΈλ© λλ€.2. μΈμ€ν΄μ€ μ΄κΈ°ν
μμ±μ ν¨μ
μ κΈ°μ λμ΄ μλ μ½λκ° ν μ€μ© μ€νλμ΄ this
μ λ°μΈλ© λμ΄μλ μΈμ€ν΄μ€λ₯Ό μ΄κΈ°ν3. μΈμ€ν΄μ€ λ°ν
μμ±μ ν¨μ
λ΄λΆμ λͺ¨λ μ²λ¦¬κ° λλλ©΄ μμ±λ μΈμ€ν΄μ€κ° λ°μΈλ©λ this
κ° μ묡μ μΌλ‘ λ°ν.
μ¦, this
μ λ°μΈλ©λμ΄ μλ μΈμ€ν΄μ€
μ νλ‘νΌν°λ λ©μλλ₯Ό μΆκ°νκ³ μμ±μ ν¨μκ° μΈμλ‘ μ λ¬λ°μ μ΄κΈ°κ°μ μΈμ€ν΄μ€ νλ‘νΌν°μ ν λΉνμ¬ μ΄κΈ°ννκ±°λ κ³ μ κ°μ ν λΉνλ€.
π‘ λ°μΈλ©μ΄λ?
λ°μΈλ©
μ΄λ μλ³μμ κ°μ μ°κ²°νλ κ³Όμ μ μλ―Έ μλ₯Ό λ€μ΄, λ³μ μ μΈμ λ³μμ΄λ¦(μλ³μ)κ³Ό ν보λ λ©λͺ¨λ¦¬ 곡κ°μ μ£Όμλ₯Ό λ°μΈλ©νλ κ²μ΄λ€.
this λ°μΈλ©
μ this(ν€μλλ‘ λΆλ₯λμ§λ§ μλ³μ μν μ νλ€)μthis
κ° κ°λ¦¬ν¬ κ°μ²΄λ₯Ό λ°μΈλ© νλ κ²μ΄λ€.
π‘ μ΄κΈ°νλ?
μ΄κΈ°ν(initialization)λ
νλ‘κ·Έλλ°μμ λ°μ΄ν° μ€λΈμ νΈλ λ³μμ μ΄κΉκ° ν λΉμ μλ―Έ μ¦, 첫 λ³μλ₯Ό μ μΈκ³Ό λμμ ν λΉμ ν κ²μμ΄κΈ°ν
λΌκ³ νλ©° μ΄ν=
μ μ¬μ©ν κ²μ ν λΉμ΄λΌ λΆλ₯Έλ€.
function Circle(radius) {
// 1. μ묡μ μΌλ‘ μΈμ€ν΄μ€κ° μμ±λκ³ thisμ λ°μΈλ© λλ€.
// 2. thisμ λ°μΈλ©λμ΄ μλ μΈμ€ν΄μ€λ₯Ό μ΄κΈ°ννλ€.
this.radius = radius;
this.getDiameter = function() {
return 2 * this.radius;
};
// 3. μμ±λ μΈμ€ν΄μ€κ° λ°μΈλ©λ thisκ° μ묡μ μΌλ‘ λ°νλλ€.
const circle = new Circle(1);
console.log(circle) // Cricle {radius: 1, getDiameter: f}
}
β λ§μ½ this
κ° μλ λ€λ₯Έ κ°μ²΄λ₯Ό λͺ
μμ μΌλ‘ λ°ννλ©΄ this
κ° λ°νλμ§ λͺ»νκ³ return
λ¬Έμ λͺ
μν κ°μ²΄κ° λ°νλλ€.
function Circle(radius) {
// 1. μ묡μ μΌλ‘ μΈμ€ν΄μ€κ° μμ±λκ³ thisμ λ°μΈλ© λλ€.
// 2. thisμ λ°μΈλ©λμ΄ μλ μΈμ€ν΄μ€λ₯Ό μ΄κΈ°ννλ€.
this.radius = radius;
this.getDiameter = function() {
return 2 * this.radius;
};
// 3. μ묡μ μΌλ‘ thisλ₯Ό λ°ννλ€.
// λͺ
μμ μΌλ‘ κ°μ²΄λ₯Ό λ°ννλ©΄ μ묡μ μΈ this λ°νμ΄ λ¬΄μλλ€.
return {};
}
// μΈμ€ν΄μ€ μμ±. Circle μμ±μ ν¨μλ λͺ
μμ μΌλ‘ λ°νν κ°μ²΄λ₯Ό λ°ννλ€.
const circle = new Circle(1);
console.log(circle); // {}
β λͺ
μμ μΌλ‘ μμ κ°μ λ°ννλ©΄ μμ κ° λ°νμ 무μλκ³ μ묡μ μΌλ‘ this
κ° λ°νλλ€.
function Circle(radius) {
// 1. μ묡μ μΌλ‘ μΈμ€ν΄μ€κ° μμ±λκ³ thisμ λ°μΈλ© λλ€.
// 2. thisμ λ°μΈλ©λμ΄ μλ μΈμ€ν΄μ€λ₯Ό μ΄κΈ°ννλ€.
this.radius = radius;
this.getDiameter = function() {
return 2 * this.radius;
};
// 3. μ묡μ μΌλ‘ thisλ₯Ό λ°ννλ€.
// λͺ
μμ μΌλ‘ μμ κ°μ λ°ννλ©΄ μμ κ° λ°νμ 무μλκ³ μ묡μ μΌλ‘ thisκ° λ°νλλ€.
return 100;
}
// μΈμ€ν΄μ€ μμ±. Circle μμ±μ ν¨μλ λͺ
μμ μΌλ‘ λ°νν κ°μ²΄λ₯Ό λ°ννλ€.
const circle = new Circle(1);
console.log(circle); // {radius: 1, getDiameter:f}
ν¨μλ μΌλ°μ μΈ ν¨μλ‘μ νΈμΆν μ μλ κ²μ λ¬Όλ‘ μμ±μ ν¨μλ‘μ νΈμΆν μ μλ€.
ν¨μλ κ°μ²΄μ΄λ―λ‘ μΌλ°κ°μ²΄μ λμΌνκ² λμν μ μλ€. ν¨μ κ°μ²΄λ μΌλ° κ°μ²΄κ° κ°μ§κ³ μλλ΄λΆ μ¬λ‘―
κ³Όλ΄λΆ λ©μλ
λ₯Ό λͺ¨λ κ°μ§κ³ μκΈ° λλ¬Έ.
// ν¨μλ κ°μ²΄λ€.
function foo() {}
// ν¨μλ κ°μ²΄μ΄λ―λ‘ νλ‘νΌν°λ₯Ό μμ ν μ μλ€.
foo.prop = 10;
// ν¨μλ κ°μ²΄μ΄λ―λ‘ λ©μλλ₯Ό μμ ν μ μλ€.
foo.method = function () {
console.log(this.prop);
};
foo.method(); // 10
ν¨μλ κ°μ²΄μ΄μ§λ§ μΌλ° κ°μ²΄μλ λ€λ¦ μΌλ° κ°μ²΄λ νΈμΆν μ μμ§λ§ ν¨μλ νΈμΆν μ μλ€ λ°λΌμ ν¨μ κ°μ²΄λ μΌλ° κ°μ²΄κ° κ°μ§κ³ μλ
λ΄λΆ μ¬λ‘―
κ³Όλ΄λΆ λ©μλ
λ λ¬Όλ‘ , ν¨μλ‘μ λμνκΈ° μν΄ ν¨μ κ°μ²΄λ§μ μν [[Environment]], [[FormalParameter]]λ±μ λ΄λΆ μ¬λ‘κ³Ό [[Call]], [[Construct]] κ°μ λ΄λΆ λ©μλλ₯Ό μΆκ°λ‘ μ§λκ³ μλ€.
ν¨μκ° μΌλ° ν¨μλ‘ νΈμΆλλ©΄ ν¨μ κ°μ²΄μ λ΄λΆ λ©μλ[[Call]]
μ΄ νΈμΆλκ³ new μ°μ°μμ ν¨κ» μμ±μ ν¨μλ‘μ νΈμΆλλ©΄ λ΄λΆ λ©μλ[[Construct]]
κ° νΈμΆλλ€.
function foo() {
// μΌλ°μ μΈ ν¨μλ‘μ νΈμΆ: [[Call]]μ΄ νΈμΆλλ€.
foo();
// μμ±μ ν¨μλ‘μ νΈμΆ: [[Construct]]κ° νΈμΆλλ€.
new foo();
λ΄λΆ λ©μλ
[[Call]]
μ κ°λ ν¨μ κ°μ²΄λ₯Όcallable
λ΄λΆ λ©μλ[[Construct]]
λ₯Ό κ°λ ν¨μ κ°μ²΄λ₯Όconstructor
,[[Construct]]
λ₯Ό κ°μ§ μλ ν¨μ κ°μ²΄λ₯Όnon-constructor
μ΄λΌκ³ λΆλ₯Έλ€.
ν¨μ κ°μ²΄λ λ°λμcallable
μ΄μ΄μΌ νλ€. λ°λΌμ λͺ¨λ ν¨μ κ°μ²΄λ λ΄λΆ λ©μλ[[Call]]
μ κ°κ³ μμΌλ―λ‘ νΈμΆ ν μ μμΌλ©° λͺ¨λ ν¨μ κ°μ²΄κ°[[Construct]]
λ₯Ό κ°λ κ²μ μλλ€. λ€μλ§ν΄,constructor
μΌ μλ μκ³non-constructor
μΌ μλ μλ€.
μλ°μ€ν¬λ¦½νΈ μμ§μ ν¨μ μ μ λ°©μμ λ°λΌ
constructor
μnon-constructor
λ‘ κ΅¬λΆνλ€.
// μΌλ° ν¨μ μ μ: ν¨μ μ μΈλ¬Έ, ν¨μ ννμ
function foo() {}
const bar = function () {};
// νλ‘νΌν° xμ κ°μΌλ‘ ν λΉλ κ²μ μΌλ° ν¨μλ‘ μ μλ ν¨μλ€. μ΄λ λ©μλλ‘ μΈμ νμ§ μλλ€.
const baz = {
x: function () {}
};
// μΌλ° ν¨μλ‘ μ μλ ν¨μλ§μ΄ constructorμ΄λ€.
new foo(); // -> foo {}
new bar(); // -> bar {}
new baz.x(); // -> x {}
// νμ΄ν ν¨μ μ μ
const arrow = () => {};
new arrow(); // TypeError: arrow is not a constructor
// λ©μλ μ μ: ES6μ λ©μλ μΆμ½ ννλ§μ λ©μλλ‘ μΈμ νλ€.
const obj = {
x() {}
};
new obj.x(); // TypeError: obj.x is not a constructor
μΌλ°ν¨μ
μμμ±μ ν¨μ
μ νΉλ³ν νμμ μ°¨μ΄λ μλ€.
μΌλ° ν¨μ
λ₯Ό μ μν΄μnew μ°μ°μ
λ₯Ό ν΅ν΄ ν¨μ νΈμΆνλ©΄μμ±μ ν¨μ
λ‘ λμνκ³ ,μμ±μ ν¨μ
λ₯Ό μ μν΄μnew μ°μ°μ
μμ΄ νΈμΆνλ©΄μΌλ° ν¨μ
λ‘ λμνλ€.
μμ±μ ν¨μ
λ μΌλ°μ μΌλ‘ 첫 λ¬Έμλ₯Ό λλ¬Έμλ‘ νμ¬ μΌλ° ν¨μμ ꡬλ³ν μ μλλ‘ νλ€.
new μ°μ°μ
μμ΄ νΈμΆλλ κ²μ λ°©μ§νκΈ° μν΄ ES6μμnew.target
μ μ§μ.
new.targetμ°μ°μ
λthis
μ μ μ¬νκ²constructor
μΈ λͺ¨λ ν¨μ λ΄λΆμμ μ묡μ μΈ μ§μλ³μμ κ°μ΄ μ¬μ©λλ©° λ©ν νλ‘νΌν°λΌκ³ λΆλ₯Έλ€.(IEλ μ§μμν¨)
newμ°μ°μ
μ ν¨κ» μμ±μ ν¨μλ‘μ νΈμΆλλ©΄ ν¨μ λ΄λΆμnew.target
μ ν¨μ μμ μ κ°λ¦¬ν¨λ€.new
μ°μ°μ μμ΄ μΌλ° ν¨μλ‘ νΈμΆλλ©΄undefined
λ₯Ό λ°ννλ€.
// μμ±μ ν¨μ
function Circle(radius) {
// μ΄ ν¨μκ° new μ°μ°μμ ν¨κ» νΈμΆλμ§ μμλ€λ©΄ new.targetμ undefinedλ€.
if (!new.target) { // undefinedμΌ λ,
// 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());
π‘ μ€μ½ν μΈμ΄ν μμ±μ ν¨ν΄
scope-safe constructor
new.target
μ μ¬μ©ν μ μλ μν©μ΄λΌλ©΄ μ€μ½ν μΈμ΄ν μμ±μ ν¨ν΄μ μ¬μ©ν μ μλ€. instanceof
μ°μ°μλ₯Ό νμ©νλ€.// Scope-Safe Constructor Pattern
function Circle(radius) {
// μμ±μ ν¨μκ° new μ°μ°μμ ν¨κ» νΈμΆλλ©΄ ν¨μμ μ λμμ λΉ κ°μ²΄λ₯Ό μμ±νκ³
// thisμ λ°μΈλ©νλ€. μ΄λ thisμ Circleμ νλ‘ν νμ
μ μν΄ μ°κ²°λλ€.
// μ΄ ν¨μκ° new μ°μ°μμ ν¨κ» νΈμΆλμ§ μμλ€λ©΄ μ΄ μμ μ thisλ μ μ κ°μ²΄ windowλ₯Ό κ°λ¦¬ν¨λ€.
// μ¦, thisμ Circleμ νλ‘ν νμ
μ μν΄ μ°κ²°λμ§ μλλ€.
if (!(this instanceof Circle)) {
// new μ°μ°μμ ν¨κ» νΈμΆνμ¬ μμ±λ μΈμ€ν΄μ€λ₯Ό λ°ννλ€.
return new Circle(radius);
}
this.radius = radius;
this.getDiameter = function () {
return 2 * this.radius;
};
}
// new μ°μ°μ μμ΄ μμ±μ ν¨μλ₯Ό νΈμΆνμ¬λ μμ±μ ν¨μλ‘μ νΈμΆλλ€.
const circle = Circle(5);
console.log(circle.getDiameter()); // 10
π‘ λΉνΈμΈ μμ±μ ν¨μ(Object, String, Number, Boolean, Function, Array, Date, RegExp, Promise λ±) new μ°μ°μ
β Object
μ Function
ν¨μλ new
μ°μ°μ μμ΄ νΈμΆν΄λ new
μ°μ°μμ ν¨κ» νΈμΆν κ²½μ°μ λμΌνκ² λμ
let obj = new Object();
console.log(obj); // {}
obj = Object();
console.log(obj); // {}
let f = new Function('x', 'return x ** x');
console.log(f); // Ζ anonymous(x) { return x ** x }
f = Function('x', 'return x ** x');
console.log(f); // Ζ anonymous(x) { return x ** x }
β String
, Number
, Boolean
μ newμ°μ°μ
μ ν¨κ» νΈμΆνμ λ κ°μ²΄λ₯Ό μμ±νμ¬ λ°ννμ§λ§, newμ°μ°μ
μμ΄ νΈμΆνλ©΄ λ¬Έμμ΄, μ«μ, λΆλ¦¬μΈ μμ κ°μ λ°ννλ€. μ΄λ₯Ό ν΅ν΄ λ°μ΄ν° νμ
λ³ννκΈ°λ ν¨.
const str = String(123);
console.log(str, typeof str); // 123 string
const num = Number('123');
console.log(num, typeof num); // 123 number
const bool = Boolean('true');
console.log(bool, typeof bool); // true boolean