August 03, 2023
new μ°μ°μμ ν¨κ» Object μμ±μ ν¨μλ₯Ό νΈμΆνλ©΄ λΉ κ°μ²΄λ₯Ό μμ±νμ¬ λ°ννλ€.
// λΉ κ°μ²΄μ μμ±
const person = new Object();
// νλ‘νΌν° μΆκ°
person.name = 'Son';
person.sayHello = function() {
console.log(`Hi! My name is ${this.name}`);
};
console.log(person);
person.sayHello;
// { name: 'Son', sayHello: [Function (anonymous)] }
// Hi! My name is Son
μμ±μ ν¨μλ new μ°μ°μμ ν¨κ» νΈμΆνμ¬ κ°μ²΄λ₯Ό μμ±νλ ν¨μλ₯Ό λ§νλ€. μμ±μ ν¨μλ‘ μμ±λ κ°μ²΄λ₯Ό μΈμ€ν΄μ€λΌ νλ€.
μλ°μ€ν¬λ¦½νΈλ Object μμ±μ ν¨μ μ΄μΈμλ λΉνΈμΈ μμ±μ ν¨μλ₯Ό μ 곡νλ€.
// String
const strObj = new String('Son');
console.log(typeof strObj);
console.log(strObj); // [String : "Son"]
// Number
const numObj = new Number(123);
console.log(typeof numObj);
console.log(numObj); // [Number : 123]
// Boolean
const boolObj = new Boolean(true);
console.log(typeof boolObj);
console.log(boolObj); // [Boolean: true]
// Function
const func = new Function('x', 'return x * x');
console.log(typeof func); // function
console.dir(func);
// Array
const arr = new Array(1, 2, 3);
console.log(typeof arr);
console.log(arr); // [1, 2, 3]
// RegExp
const regExp = new RegExp(/ab+c/i);
console.log(typeof regExp);
console.log(regExp); // /ab+c/i
// Date
const date = new Date();
console.log(typeof date);
console.log(date); // 2023-08-03T04:11:37.506Z
κ°μ²΄λ₯Ό μμ±νλ λ°©λ²μ κ°μ²΄ 리ν°λ΄μ μ¬μ©νλ κ²μ΄ λ κ°νΈνλ€. κ΅³μ΄ Object μμ±μ ν¨μλ₯Ό μ¬μ©ν΄ κ°μ²΄λ₯Ό μμ±νλ λ°©μμ νΉλ³ν μ΄μ κ° μλ€λ©΄ κ·Έλ€μ§ μ μ©ν΄ 보μ΄μ§ μλλ€.
κ°μ²΄ 리ν°λ΄μ μν κ°μ²΄ μμ± λ°©μμ λ¨ νλμ κ°μ²΄λ§ μμ±νλ€. λμΌν νλ‘νΌν°λ₯Ό κ°μ§ κ°μ²΄λ₯Ό μ¬λ¬ κ° μμ±νλ κ²½μ° λ§€λ² κ°μ νλ‘νΌν°λ₯Ό κΈ°μ ν΄μΌ νλ€.
const circle1 = {
radius: 5,
getDiameter() {
return 2 * this.radius;
},
};
const circle2 = {
radius: 10,
getDiameter() {
return 2 * this.radius;
},
};
console.log(circle1.getDiameter()) // 10
console.log(circle2.getDiameter()) // 20
μμ±μ ν¨μλ₯Ό μ¬μ©νμ¬ νλ‘νΌν° κ΅¬μ‘°κ° λμΌν κ°μ²΄ μ¬λ¬ κ°λ₯Ό κ°νΈνκ² μμ±ν μ μλ€.
// μμ±μ ν¨μ
function Circle(radius) {
// μμ±μ ν¨μ λ΄λΆμ thisλ μμ±μ ν¨μκ° μμ±ν μΈμ€ν΄μ€λ₯Ό κ°λ¦¬ν¨λ€.
this.radius = radius;
this.getDiameter = function() {
return 2 * this.radius;
}
}
const circle1 = new Circle(5);
const circle2 = new Circle(10);
console.log(circle1.getDiameter()); // 10
console.log(circle2.getDiameter()); // 20
μμ±μ ν¨μλ μ΄λ¦ κ·Έλλ‘ κ°μ²΄(μΈμ€ν΄μ€)λ₯Ό μμ±νλ ν¨μλ€.
new μ°μ°μμ ν¨κ» νΈμΆνλ©΄ ν΄λΉ ν¨μλ μμ±μ ν¨μλ‘ λμνλ€.
// new μ°μ°μμ ν¨κ» νΈμΆνμ§ μμΌλ©΄ μμ±μ ν¨μλ‘ λμνμ§ μλλ€.
// μΌλ° ν¨μλ‘ νΈμΆλ¨
const circle3 = Circle(15);
console.log(circle3); // undefined
// μΌλ° ν¨μλ‘μ νΈμΆλ Circle λ΄μ thisλ μ μ κ°μ²΄λ₯Ό κ°λ¦¬ν¨λ€.
console.log(radius); // 15
μμ±μ ν¨μμ μν μ νλ‘νΌν° κ΅¬μ‘°κ° λμΌν μΈμ€ν΄μ€λ₯Ό μμ±νκΈ° μν ν νλ¦Ώ(ν΄λμ€)μΌλ‘μ λμνμ¬ μΈμ€ν΄μ€λ₯Ό μμ±νλ κ²κ³Ό μμ±λ μΈμ€ν΄μ€λ₯Ό μ΄κΈ°ν(μΈμ€ν΄μ€ νλ‘νΌν° μΆκ° λ° μ΄κΈ°κ° ν λΉ)νλ κ²μ΄λ€.
function Circle(radius) {
this.radius = radius;
this.getDiameter = function() {
return 2 * this.radius;
}
}
const circle1 = new Circle(5);
μλ°μ€ν¬λ¦½νΈ μμ§μ μ묡μ μΈ μ²λ¦¬λ₯Ό ν΅ν΄ μΈμ€ν΄μ€λ₯Ό μμ±νκ³ λ°ννλ€. new μ°μ°μμ ν¨κ» μμ±μ ν¨μλ₯Ό νΈμΆνλ©΄ μλ°μ€ν¬λ¦½νΈ μμ§μ μ묡μ μΌλ‘ μΈμ€ν΄μ€λ₯Ό μ΄κΈ°νν ν μ묡μ μΌλ‘ μΈμ€ν΄μ€λ₯Ό λ°ννλ€.
β μμ±μ ν¨μ λ΄λΆμμ return
λ¬Έμ λ°λμ μλ΅ν΄μΌ νλ€.
// ν¨μλ κ°μ²΄λ€.
function foo() {};
// ν¨μλ κ°μ²΄μ΄λ―λ‘ νλ‘νΌν°λ₯Ό μμ ν μ μλ€.
foo.prop = 10;
// ν¨μλ κ°μ²΄μ΄λ―λ‘ λ©μλλ₯Ό μμ ν μ μλ€.
foo.method = function() {
console.log(this.prop);
}
foo.method(); // 10
ν¨μλ κ°μ²΄μ΄μ§λ§ μΌλ° κ°μ²΄μλ λ€λ₯΄λ€. μΌλ° κ°μ²΄λ νΈμΆν μ μμ§λ§ ν¨μλ νΈμΆν μ μλ€.
ν¨μ κ°μ²΄λ μΌλ° κ°μ²΄κ° κ°μ§κ³ μλ λ΄λΆ μ¬λ‘―κ³Ό λ΄λΆ λ©μλλ λ¬Όλ‘ , ν¨μλ‘μ λμνκΈ° μν΄ ν¨μ κ°μ²΄ λ§μ μν Environment, FormalParameter λ±μ λ΄λΆ μ¬λ‘―κ³Ό Call, Construct κ°μ λ΄λΆ λ©μλλ₯Ό μΆκ°λ‘ κ°μ§κ³ μλ€.
function foo() {};
// μΌλ°μ μΈ ν¨μλ‘μ νΈμΆ: Call νΈμΆ
foo();
// μμ±μ ν¨μλ‘μ νΈμΆ: Construct νΈμΆ
new foo();
λ΄λΆ λ©μλ Call μ κ°λ ν¨μ κ°μ²΄λ₯Ό callable μ΄λΌ νλ©°, λ΄λΆ λ©μλ Construct λ₯Ό κ°λ ν¨μ κ°μ²΄λ₯Ό constructor, Construct λ₯Ό κ°μ§ μμ ν¨μ κ°μ²΄λ₯Ό non-constructorλΌκ³ λΆλ₯Έλ€.
callable μ νΈμΆν μ μλ κ°μ²΄, μ¦ ν¨μλ₯Ό λ§νλ©°
νΈμΆν μ μλ κ°μ²΄λ ν¨μ κ°μ²΄κ° μλλ―λ‘ ν¨μλ‘μ κ°λ₯νλ κ°μ²΄, μ¦ ν¨μ κ°μ²΄λ λ°λμ callable μ΄μ΄μΌ νλ€. β λͺ¨λ ν¨μ κ°μ²΄λ λ΄λΆ λ©μλ Callμ κ°κ³ μμΌλ―λ‘ νΈμΆν μ μλ€.
// μΌλ° ν¨μ μ μ: ν¨μ μ μΈλ¬Έ, ν¨μ ννμ
function foo() {};
const bar = function() {};
// νλ‘νΌν° xμ κ°μΌλ‘ ν λΉλ κ²μ μΌλ° ν¨μλ‘ μ μλ ν¨μλ€. μ΄λ λ©μλλ‘ μΈμ νμ§ μμ
const baz = {
x: function() {},
};
// μΌλ° ν¨μλ‘ μ μλ ν¨μλ§μ΄ constructor.
new foo(); // foo {}
new bar(); // bar {}
new bar.x(); // x {}
// νμ΄ν ν¨μ μ μ
const arrow = () => {};
new arrow(); // TypeError
// λ©μλ μ μ: ES6 μ λ©μλ μΆμ½ ννλ§ λ©μλλ‘ μΈμ
const obj = {
x() {},
};
new obj.x(); // TypeError:
μμ±μ ν¨μλ‘μ νΈμΆλ κ²μ κΈ°λνκ³ μ μνμ§ μμ μΌλ° ν¨μ(callble / constructor)μ 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('Son', 'admin');
// ν¨μκ° μμ±λ κ°μ²΄ λ°ν
console.log(inst); // { name: 'Son', role: 'admin' }
λ°λλ‘ new μ°μ°μ μμ΄ μμ±μ ν¨μλ₯Ό νΈμΆνλ©΄ μΌλ° ν¨μλ‘ νΈμΆλλ€.
function Circle(radius) {
this.radius = radius
this.getDiameter = function() {
return 2 * this.radius
}
}
const circle1 = Circle(5);
console.log(circle1); // undefined
// μΌλ° ν¨μ λ΄λΆμ thisλ μ μ κ°μ²΄ windowλ₯Ό κ°λ¦¬ν¨λ€.
console.log(radius); // 5
console.log(getDiameter()); // 10
circle1.getDiameter(); // TypeError
μ μμ μ Circle ν¨μλ μΌλ° ν¨μλ‘μ νΈμΆλμκΈ° λλ¬Έμ Circle ν¨μ λ΄λΆμ thisλ μ μ κ°μ²΄ windowλ₯Ό κ°λ¦¬ν¨λ€. β radius νλ‘νΌν°, getDiameter λ©μλλ μ μ κ°μ²΄μ νλ‘νΌν°μ λ©μλκ° λλ€.
new.target
μμ±μ ν¨μκ° new μ°μ°μ μμ΄ νΈμΆλλ κ²μ λ°©μ§νκΈ° μν΄ νμ€μΉΌ μΌμ΄μ€ 컨벀μ
μ μ¬μ©νλ€ νλλΌλ μ€μκ° λ°μν μ μλ€. β ES6μμλ new.target
μ μ§μνλ€.
new.target
μ thisμ μ μ¬νκ² constructorμΈ λͺ¨λ ν¨μ λ΄λΆμμ μ묡μ μΈ μ§μ λ³μμ κ°μ΄ μ¬μ©λλ©° λ©ν νλ‘νΌν°λΌκ³ λΆλ₯Έλ€.
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()); // 10
μ°Έκ³ λ‘ λλΆλΆμ λΉνΈμΈ μμ±μ ν¨μλ new μ°μ°μμ ν¨κ» νΈμΆλμλμ§λ₯Ό νμΈν ν μ μ ν κ°μ λ°ννλ€.
let obj = new Object();
console.log(obj); // {}
obj = Object();
console.log(obj); // {}
let f = new Function('x', 'return x ** x');
console.log(f); // [Function: anonymous]
f = Function('x', 'return x ** x');
console.log(f); // [Function: anonymous]
νμ§λ§ 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(1);
console.log(bool, typeof bool); // true boolean