프로토타입이란?
상속 메소드
프로토타입과 생성자 함수
프로토타입 체인
// 생성자 함수
function Person(name) {
this.name = name;
}
//생성자 함수의 프로토타입에 메소드 정의
Person.prototype.sayHello = function() {
console.log(`Hello, my name is ${this.name}`);
};
//생성자 함수로 인스턴스 생성
const john = new Person("John");
//인스턴스에서 메소드 실행 가능
john.sayHello(); // "Hello, my name is John" 출력
이 예제에서 john 객체는 Person의 인스턴스다. john.sayHello()를 호출할 때, JavaScript는 먼저 john 객체에서 sayHello 메소드를 찾는다. 찾지 못하면, Person.prototype에서 sayHello 메소드를 찾아 호출한다. 이 과정이 바로 프로토타입 체인을 통한 상속이다.
프로토타입을 활용한 예시 : Map 객체와 메소드
생성자 함수를 정의하고 이 생성자 함수의 prototype 속성을 사용하여 여러 메소드를 추가할 수 있다.
이렇게 추가된 메소드는 생성자 함수로 생성된 모든 객체에서 사용할 수 있다.
JavaScript의 내장 Map 객체는 여러 유용한 메소드를 제공하는데, 이 메소드들은 Map.prototype을 통해 접근하고 확장할 수 있는 좋은 예시이다.
Map() : 생성자 함수로서, JavaScript의 내장 객체 중 하나이다.
Map 객체는 키-값 쌍을 저장하는데 사용되며, 이를 조작하기 위한 다양한 메소드를 제공한다. 여기에는 set, get, has, delete, clear 등이 포함된다.
Map 메소드:
set(key, value): 키-값 쌍을 Map에 추가하거나 업데이트한다.get(key): 주어진 키에 해당하는 값을 반환한다. 키가 Map에 없다면 undefined를 반환한다.has(key): Map이 주어진 키를 가지고 있는지에 대한 불리언 값을 반환한다.delete(key): 주어진 키와 관련된 요소를 Map에서 삭제하고, 성공적으로 삭제되면 true를, 그렇지 않으면 false를 반환한다.clear(): Map의 모든 키-값 쌍을 삭제한다.forEach(callbackFn): Map의 각 키-값 쌍에 대해 주어진 콜백 함수를 실행한다.
// Map 객체 생성
const map = new Map();
// set 메소드를 사용하여 키-값 쌍 추가
map.set('name', 'John Doe');
map.set('age', 30);
// get 메소드를 사용하여 값 검색
console.log(map.get('name')); // John Doe
console.log(map.get('age')); // 30
// has 메소드를 사용하여 키 존재 여부 확인
console.log(map.has('name')); // true
console.log(map.has('gender')); // false
// delete 메소드를 사용하여 키-값 쌍 삭제
map.delete('age');
console.log(map.has('age')); // false
// forEach 메소드를 사용하여 모든 키-값 쌍 출력
map.forEach((value, key) => {
console.log(`${key}: ${value}`);
});
// 출력:
// name: John Doe
// clear 메소드를 사용하여 모든 키-값 쌍 삭제
map.clear();
console.log(map.size); // 0
이와 같이, 내장 객체 Map은 프로토타입을 통해 여러 함수를 포함하고 있다. 따라서 생성자를 사용해 새로운 객체를 생성할 때, 이 내장 객체의 프로토타입에 연결된 함수들을 새 객체에서도 사용할 수 있게 된다.
프로토타입 사용 이유
React에서는
함수형 컴포넌트를 사용하는 react에서는 생성자 함수를 직접 다룰 일이 거의 없다.
Hooks로 기능들을 해결했기 때문이다.
연관 키워드
객체지향 프로그래밍