메소드 호출은 객체.메소드()와 같이 객체 내에 메소드를 호출하는 방법을 의미한다.
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
💻 싱글톤(Singleton) 패턴으로 규현한 counter 예시
function makeCounter() {
return {
value: 0,
increase: function() {
this.value++ // 메소드 호출을 할 경우, this는 makeCounter 함수가 리턴하는 익명의 객체입니다
},
decrease: function() {
this.value--
},
getValue: function() {
return this.value;
}
}
}
let counter1 = makeCounter()
counter1.increase()
counter1.getValue() // 1
let counter2 = makeCounter()
counter2.decrease()
counter2.decrease()
counter2.getValue() // -2
💻 클로저 모듈 패턴으로 구현한 counter 예시
하나의 모델이 되는 청사진(blueprint)을 만들고, 그 청사진(blueprint), 설계도를 바탕으로 한 객체를 만드는 프로그래밍 패턴이다.
function Car(brand, name, color) { // es5 방식
// 인스턴스가 만들어질 때 실행되는 코드
// 생성자 함수는 return 값을 만들지 않는다
}
class Car { // es6 방식
constructor(brand, name, color) {
// 인스턴스가 만들어질 때 실행되는 코드
// 생성자 함수는 return 값을 만들지 않는다
}
}
💻 함수, class 키워드를 이용하여 정의하는 방법
let avante = new Car('hyundai', 'avante', 'black');
let mini = new Car('bmw', 'mini', 'white');
let beetles = new Car('volkswagen', 'beetles', 'red');
💻 new 키워드를 사용하여 인스턴스를 만드는 방법
class Counter {
constructor() {
this.value = 0; // 생성자 호출을 할 경우, this는 new 키워드로 생성한 Counter의 인스턴스입니다
}
increase() {
this.value++
}
decrease() {
this.value--
}
getValue() {
return this.value
}
}
let counter1 = new Counter() // 생성자 호출
counter1.increase()
counter1.getValue() // 1
💻 OOP 패턴으로 구현한 counter 예시
| 속성 | 메소드 |
|---|---|
| brand | refuel() |
| name | setSpeed() |
| color | drive() |
| currentFuel | |
| maxSpeed |
function Car(brand, name, color) { // es5 방식
this.brand = brand;
this.name = name;
this.color = color;
}
class Car { // es6 방식
constructor(brand, name, color) {
this.brand = brand;
this.name = name;
this.color = color;
}
}
💻 this라는 인스턴스 객체에 속성을 할당하는 예시
function Car(brand, name, color) { // es5 방식
Car.prototype.refuel = function() {
// 연료 공급을 구현하는 코드
}
Car.prototype.drive = function() {
// 운전을 구현하는 코드
}
}
class Car { // es6 방식
constructor(brand, name, color) {
}
refuel() {
// 연료 공급을 구현하는 메소드
}
drive() {
// 운전을 구현하는 메소드
}
}
💻 class 안쪽에 만드는 메소드 정의 예시(ES6)
let avante = new Car('hyundai', 'avante', 'black');
avante.color; // 'black'
avante.drive(); // 아반떼가 운전을 시작합니다
let mini = new Car('bmw', 'mini', 'white');
avante.color; // 'bmw'
avante.refuel(); // 미니에 연료를 공급합니다
💻 인스턴스에서의 사용
| prototype | 모델의 청사진을 만들 때 쓰는 원형 객체 |
| constructor | 인스턴스가 초기화될 때 실행하는 생성자 함수 |
| this | 함수가 실행될 때 해당 scope마다 생성되는 고유한 실행 context. new 키워드로 인스턴스를 생성했을 때에는 해당 인스턴스가 바로 this의 값이 됨 |
클래스라고 부르는 데이터 모델의 청사진을 사용해 코드 작성객체로 그룹화javascript는 프로토타입 기반 언어이다. 여기서 프로토타입은 원형 객체를 의미한다.
class Human {
constructor(name, age) {
this.name = name;
this.age = age;
}
sleep() {
console.log(`${this.name}은 잠에 들었습니다`);
}
}
let kimcoding = new Human('김코딩', 30);
// 실습해보세요
Human.prototype.constructor === Human; // 결과는 무엇일까요?
Human.prototype === kimcoding.__proto__; // 결과는 무엇일까요?
Human.prototype.sleep === kimcoding.sleep; // 결과는 무엇일까요?
💻 OOP 패턴으로 구현한 Human 예시
let kimcoding = new Human('김코딩', 30);
// 속성
kimcoding.age;
kimcoding.gender;
// 메소드
kimcoding.eat();
kimcoding.sleep();
💻 클래스 Human의 속성과 메소드 예시
let parkhacker = new Student('박해커', 22);
// 속성
parkhacker.grade;
// 메소드
parkhacker.learn();
💻 클래스 Student의 속성과 메소드 예시