클래스란 같은 종류 집단에 속하는 속성과 행위를 정의한 것이다. 인스턴스는 런타임에 그 구조 변경할 수 없다.
프로토타입 기반 언어
JS에는 클래스 개념이 없지만 객체 생성 방법이 존재한다.
객체 리터럴
Object() 생성자 함수
생성자 함수
ES6의 class가 도입되었다. ES6의 클래스는 새로운 OOP 모델이 아니고 Class도 사실 함수이고 기존 prototype 기반의 syntatic sugar다.
생성자 함수와 인스턴스 생성
// 생성자 함수(Constructor)
function Person(name) {
// 프로퍼티
this.name = name;
// 메소드
this.setName = function(name) {
this.name = name;
};
// 메소드
this.getName = function() {
return this.name;
};
}
var me = new Person('Lee');
var you = new Person('Kim');
var him = new Person('Choi');
console.log(me); // Person { name: 'Lee', setName: [Function], getName: [Function] }
console.log(you); // Person { name: 'Kim', setName: [Function], getName: [Function] }
console.log(him); // Person { name: 'Choi', setName: [Function], getName: [Function] }
위 생성자 함수의 문제점은?
여러개의 인스턴스 생성시 모든 인스턴스가 중복된 메소드를 프로퍼퍼티 가진다. 메모리 낭비다.
프로토타입 체인으로 해결하자.
function Person(name) {
this.name = name;
}
// 프로토타입 객체에 메소드 정의
Person.prototype.setName = function(name) {
this.name = name;
};
// 프로토타입 객체에 메소드 정의
Person.prototype.getName = function() {
return this.name;
};
var me = new Person('Lee');
var you = new Person('Kim');
var him = new Person('choi');
console.log(Person.prototype);
// Person { setName: [Function], getName: [Function] }
console.log(me); // Person { name: 'Lee' }
console.log(you); // Person { name: 'Kim' }
console.log(him); // Person { name: 'choi' }
상속
새롭게 정의할 클래스가 기존 클래스와 유사하다면 상속을 통해 다른 점만 구현하면된다. 코드 재사용은 개발 비용을 줄이기 때문에 중요하다.
JS는 프로토타입을 통해 상속을 구현한다. 즉, 프로토타입을 통해 객체가 다른 객체로 직접 상속된다는 의미다