객체 생성 방법
- 객체 리터럴
- 생성자 함수
생성자 함수
: new 연산자와 함께 호출하여 객체(인스턴스)를 생성하는 함수
인스턴스
: 생성자 함수에 의해 생성된 객체
Javascript는 Object, String, Number, Boolean, Function, Array..... 등의 빌트인 생성자 함수 제공한다.
const person = new Object();
person.name = 'kim';
person.sayHello = function(){console.log('hi')}
console.log(person) // {name:'kim'}
person.sayHello(); // hi
this
: 객체 자신의 프로퍼티나 메서드를 참조하기 위한 자기 참조 변수
this 바인딩은 함수 호출 방식에 따라 동적으로 결정된다.
함수 호출 방식 | this가 가리키는 값(this 바인딩) |
---|---|
일반 함수로서 호출 | 전역 객체 |
메서드로서 호출 | 메서드를 호출한 객체(마침표 앞의 객체) |
생성자 함수로서 호출 | 생성자 함수가 (미래에) 생성할 인스턴스 |
일반 함수와 동일한 방법으로 생성자 함수를 정의하고, new 연산자와 함께 호출하면 해당 함수는 생성자 함수로 동작한다.
만약 new 연산자와 함께 생성자 함수를 호출하지 않으면 생성자 함수가 아니라 일반 함수로 동작한다.
function Circle(radius){
this.radius = radius;
this.getDiameter = function (){
return 2 * this.radius;
}
}
const circle3 = Circle(15)
console.log(circle3) // undefined
console.log(radius) // 15
// 1. this.radius는 전역 객체의 radius라는 속성을 설정하려 시도한다.
// 2. 따라서 radius는 전역 범위에 15인 변수 생성함
인스턴스 생성과 this 바인딩
바인딩
: 식별자와 값을 연결하는 과정
this 바인딩
: this와 this가 가리킬 객체를 바인딩하는 것이다.
인스턴스 초기화
인스턴스 반환
일반적인 함수로서 호출
, 생성자 함수로서 호출
(new 연산자와 함께 객체 생성하는 것) 할 수 있다.callable
: [[call]] 내부 메서드를 갖는 함수 객체 <-> non-callableconstructor
: [[constructor]] 내부 메서드를 갖는 함수 객체 <-> non-constructorconstructor
: 함수 선언문, 함수 표현식, 클래스non-constructor
: 메서드, 화살표 함수// 스코프 세이프 생성자 패턴
function Circle(radius){
if(!new.target){
return new Circle(radius)
}
}