const coffeeMachine = { // coffeeMachine 객체리터럴 생성
// 프로퍼티
modelName: 'daf-123',
menu: ['americano', 'latter', 'herbal tea'],
machineManager: 'park',
coffeeBean: { // 객체도 프로퍼티 가능
name: 'robusta',
origin: 'west africa',
price: 100
},
// 메소드
makeCoffee: function() {
console.log(`${this.menu[1]}가 완성되었습니다.`);
},
getmodelname() { // ES6에서는 이렇게 메서드를 추가할 수 있는 문법이 생겼습니다.
console.log(`${this.modelName}`);
}
};
console.log(coffeeMachine.machineManager); // 'park' 출력, 점 연산자 사용
console.log(coffeeMachine['machineManager']); // 'park' 출력, 대괄호 사용
console.log(coffeeMachine['coffeeBean'].price); // 100 출력
coffeeMachine.makeCoffee(); // 'latte가 완성되었습니다.' 출력
coffeeMachine.getmodelname(); // 'daf-123' 출력
함수를 선언한 다음 new
키워드로 객체를 생성하는 방법입니다.
새로운 객체를 생성할 때마다 객체의 메소드가 매번 새로 생성되므로 비효율적입니다.
const CoffeeMachine = function (menu, price) {
this.menu = menu;
this.price = price;
};
CoffeeMachine.prototype.makeCoffee = function () {
console.log(`${this.menu}가 완성되었습니다.`);
};
const coffee = new CoffeeMachine('lette', 100);
const CoffeeMachine = function (menu, price) {
this.menu = menu;
this.price = price;
};
CoffeeMachine.prototype.makeCoffee = function () {
console.log(`${this.menu}가 완성되었습니다.`);
};
CoffeeMachine.prototype.getPrice = function () {
console.log(`${this.price}`);
}
const coffee = new CoffeeMachine('lette', 100);
const coffee2 = new CoffeeMachine('americano', 50);
coffee.getPrice();
coffee.makeCoffee();
console.log(coffee.__proto__ === coffee2.__proto__); // true 출력
// 같은 클래스에서 생성된 인스턴스들은 같은 프로토타입을 공유
console.log(coffee.__proto__ === CoffeeMachine.prototype); // true 출력
// coffee 오브젝트의 __proto__ 프로퍼티에 CoffeeMachine 클래스의 getPrice(), makeCoffee() 메소드 저장됨.
console.log(coffee.getPrice === coffee2.getPrice); // true 출력
coffee2.getPrice(); // 50출력
coffee2.getPrice = function () {
console.log('coffee2의 getPrice 메소드 재정의 함.');
};
console.log(coffee.getPrice === coffee2.getPrice); // false 출력
// coffee2 인스턴스 안에서 프로토타입의 메소드와 동일한 이름의 메소드를 정의하면 프로토타입의 메소드는 가려지고 인스턴스의 메소드가 호출된다.
coffee2.getPrice(); // 'coffee2의 getPrice 메소드 재정의 함.' 출력
모든 함수에는 prototype
이라는 특별한 프로퍼티가 있습니다.
객체 생성자로 동작하는 함수에서는 prototype
이 매우 중요합니다
new 키워드로 만든 새 객체는 생성자의 prototype 프로퍼티에 접근할 수 있습니다.
객체 인스턴스는 생성자의 prototype 프로퍼티를 __proto__프로퍼티에 저장합니다.
객체의 프로퍼티나 메소드에 접근하려 할 때 만약 객체에 찾는 프로퍼티나 메소드가 없다면 객체의 프로토타입에서 해당 프로퍼티나 메소드를 찾습니다.
같은 클래스에서 생성된 객체 인스턴스들은 모두 같은 프로토타입을 공유합니다.
자바스크립트는 먼저 인스턴스에서 원하는 프로퍼티나 메소드를 탐색하고, 없다면 프로토타입에서 찾기 때문에, 인스턴스에서 프로퍼티나 메소드를 정의하면 프로토타입에 있는 것을 가리는 효과가 있습니다.