객체.메서드()
와 같이 객체 내에 메서드를 호출하는 방법을 의미let counter1 = {
value: 0,
increase: function() {
this.value++ // 메서드 호출을 할 경우, this는 counter1을 가리킵니다
},
decrease: function() {
this.value--
},
getValue: function() {
return this.value
}
}
// 메서드 호출하기 (객체.메서드())
counter1.increase()
counter1.increase()
counter1.increase()
counter1.decrease()
counter1.getValue() // 2
위의 예시에서 함수 counter1
은 단 하나의 객체만 만들 수 있다.
만약 같은 기능을 사용하는 카운터가 여러 개 필요하다면 그 때마다 매번 코드를 만들어야 할까?.
비효율적일 것이다.
이렇듯 비효율적인 반복을 줄여주기 위해서는 클로저 모듈 패턴을 사용할 수 있다.
클로저 모듈 패턴으로 구현한 counter 예시
function makeCounter() {
let value = 0;
return {
increase: function() {
value++;
},
decrease: function() {
value--;
},
getValue: function() {
return value;
}
}
}
let counter1 = makeCounter()
counter1.increase()
counter1.getValue() // 1
let counter2 = makeCounter()
counter2.decrease()
counter2.decrease()
counter2.getValue() // -2
- 하나의 모델이 되는 청사진(blueprint)을 만들고,
그 청사진을 바탕으로 한 객체(object)를 만드는 프로그래밍 패턴이다.
instance object
),class
)라고 부른다.
- 하나의 모델이 되는 청사진(blueprint)을 만들고, ➡ class
그 청사진을 바탕으로 한 객체(object)를 만드는 프로그래밍 패턴이다. ➡ instance
new
키워드인스턴스 객체를 만드는 방법은 그냥 일반적인 함수를 정의하듯 만들면 된다.
이때 함수를 이용하는 방법이 조금 다르다.
바로 실행할 때 클래스 이름 앞에 new
키워드를 쓰는 것이다.
function Car(color) { }
// 클래스 이름 앞에 `new` 키워드 붙이기
let avante = new Car('blue');
let mini = new Car('white');
let beetles = new Car('red');
new
키워드를 사용하면 즉시 생성자 함수가 실행되며, 변수에 클래스의 설계를 가진 새로운 객체, 즉 인스턴스가 할당된다.avante
, mini
, beetles
)는 Car
라는 클래스의 고유한 속성과 메소드를 갖는다.return
값을 만들지 않는다.function Car(brand, name, color) {
// 인스턴스가 만들어질 때 실행되는 코드
}
class
키워드로 정의class Car {
constructor(brand, name, color) {
// 인스턴스가 만들어질 때 실행되는 코드
}
}
this
키워드 : 인스턴스 객체를 의미한다.this
에 할당한다는 것은 만들어진 인스턴스에 해당 브랜드
, 이름
, 색상
을 부여하겠다는 의미이다.function Car1(brand, name, color) {
this.brand = brand;
this.name = name;
this.color = color;
}
class Car {
constructor (brand, name, color) {
this.brand = brand;
this.name = name;
this.color = color;
}
}
prototype
이라는 키워드를 사용해야 메서드를 정의할 수 있다.
function Car(brand, name, color) {
/* 생략 */
}
Car.prototype.refuel = function() {
// 연료 공급을 구현하는 코드
console.log(`${this.name}에 연료를 공급합니다.`)
}
Car.prototype.drive = function() {
// 운전을 구현하는 코드
console.log(`${this.name}가 운전을 시작합니다.`)
}
생성자 함수와 함께 class
키워드 안쪽에 묶어서 정의한다. (refuel() {}
, drive() {}
)
class Car {
constructor(brand, name, color) {
/* 생략 */
}
refuel() {
// 연료 공급을 구현하는 코드
console.log(`${this.name}에 연료를 공급합니다.`)
}
drive() {
// 운전을 구현하는 코드
console.log(`${this.name}가 운전을 시작합니다.`)
}
}
설정한 속성과 메서드를 인스턴스에서 사용해보자.
let avante = new Car('hyundai', 'avante', 'black');
avante.color; // 'black'
avante.drive(); // avante가 운전을 시작합니다.
let mini = new Car('bmw', 'mini', 'white');
mini.brand; // 'bmw'
mini.refuel(); // mini에 연료를 공급합니다.
용어 | 설명 |
---|---|
prototype | 모델의 청사진을 만들 때 쓰는 원형 객체(original form)이다. |
constructor | 인스턴스가 초기화될 때 실행하는 생성자 함수 |
this | 함수가 실행될 때, 해당 scope마다 생성되는 고유한 실행 context(execution context)new 키워드로 인스턴스를 생성했을 때에는, 해당 인스턴스가 바로 this 의 값이 됨 |