new 연산자와 함께 Object 생성자 함수를 호출 -> 빈 객체를 생성하여 반환
const person = new Object(); const person2 = { }
생성자 함수
(constructor)
new 연산자와 함께 호출하여 객체(인스턴스)를 생성하는 함수
// String 생성자 함수에 의한 String 객체 생성
const strObj = new String('Lee');
console.log(typeof strObj); // object
console.log(strObj); // String {"Lee"}
// 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); // function
console.dir(func); // ƒ anonymous(x)
// Array 생성자 함수에 의한 Array 객체(배열) 생성
const arr = new Array(1, 2, 3);
console.log(typeof arr); // object
console.log(arr); // [1, 2, 3]
// RegExp 생성자 함수에 의한 RegExp 객체(정규 표현식) 생성
const regExp = new RegExp(/ab+c/i);
console.log(typeof regExp); // object
console.log(regExp); // /ab+c/i
// Date 생성자 함수에 의한 Date 객체 생성
const date = new Date();
console.log(typeof date); // object
console.log(date); // Mon May 04 2020 08:36:33 GMT+0900 (대한민국 표준시)
- 인스턴스
(instance)
생성자 함수에 의해 생성된 객체
built-in 생성자
함수객체 리터럴에 의한 객체 생성 방식의 문제점
1. 단 하나의 객체만 생성해야 함
2. 동일한 프로퍼티를 갖는 객체를 여러 개 생성해야 하는 경우 매번 같은 프로퍼티를 기술해야 하기에 상당히 비효율적
객체 : 프로퍼티를 통해 객체 고유의 상태 (state)를 표현
메서드를 통해 상태 데이터인 프로퍼티를 참조하고 조작하는 동작을 표현
생성자 함수를 사용하면 프로퍼티 구조가 동일한 객체 여러 개를 간편하게 생성가능!
//생성자 함수
function Circle(radius) {
//인스턴스 초기화
this.radius = radius;
this.getDiameter = function () {
return 2 * this.radius;
};
}
//인스턴스 생성
const c1 = new Circle(4);
const c2 = new Circle(8);
console.log(c1.getDiameter());
console.log(c2.getDiameter());
인스턴스 생성
과정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); // {}
함수
로서 동작하기 위해 함수 객체만을 위한 [[Environment]]
, [[FormalParameters]], [[Call]], [[Construct]]같은 내부 메서드를 추가로 가짐 function foo() {}
// 일반적인 함수로서 호출: [[Call]]이 호출된다.
foo();
// 생성자 함수로서 호출: [[Construct]]가 호출된다.
new foo();
- constructor : 함수 선언문, 함수 표현식, 클래스(클래스도 함수)
- non-constructor : 메서드 , 화살표 함수
new 연산자가 있으면, 생성자 함수로 동작 없으면, 일반 함수로 호출
new 연산자와 함께 생성자 함수로서 호출되면 함수 내부의 new.target은 함수 자신을 말한다
만약, new연산자가 없이 일반함수로서 호출되면 undefined이다