OOP 간단 정리
클래스 기반 언어
클래스란 같은 종류 집단에 속하는 속성과 행위를 정의한 것이다. 인스턴스는 런타임에 그 구조 변경할 수 없다.
프로토타입 기반 언어
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] }위 생성자 함수의 문제점은?
여러개의 인스턴스 생성시 모든 인스턴스가 중복된 메소드를 프로퍼퍼티 가진다. 메모리 낭비다.
프로토타입 체인으로 해결하자.
상속
새롭게 정의할 클래스가 기존 클래스와 유사하다면 상속을 통해 다른 점만 구현하면된다. 코드 재사용은 개발 비용을 줄이기 때문에 중요하다.
JS는 프로토타입을 통해 상속을 구현한다. 즉, 프로토타입을 통해 객체가 다른 객체로 직접 상속된다는 의미다
JS의 상속 구현 방식은 클래스 기반 언어의 상속 흉내내서 구현할 수 있다.
클래스 기반 언어의 상속 방식 흉내내기
프로토타입 패턴 상속
Object.create 함수를 사용하여 객체에서 다른 객체로 직접 상속 구현하기 위 패턴보다 간단하다. 위 방식에 비해 new 연산자를 통한 prototype 교체, 생성자 링크 파괴 등이 없다.
인스턴스 child의 proto 는 Parent.prototype이다. 프로토타입 체인에 의해 Parent.prototype에 접근가능하다.
여기서 문제를 보완하자면
Child.prototype.constructor는 Parent다.
왜냐하면 인스턴스의 contructor 프로퍼티는 자신을 생성한 생성자 함수를 바라본다.
Child 생성자 함수로 변경해주자.
더 보완하자면 Child.prototype = new Parent();에서 새 인스턴스를 만들지 않고, Object.create(proto)메서드로 대체할 수 있다.
이 메서드는 proto인자에 전달된 객체를 프로토타입 객체로 갖는 새로운 객체를 리턴한다.
Object.create
폴리필을 보면
임의의 생성자 함수 F 생성
생성자 함수 F의 prototype 프로퍼티에 전달된 객체를 할당한다.
생성자 함수 F의 인스턴스를 생성하여 반환.
Summary
상속을 구현하기 위해 프로토타입을 이용하면된다.
상속 여부를 확인하기 위해서는 insatanceof 메서드를 사용하면 된다. 이 메서드는 생성자의 prototype 속성이 객체의 프로토타입 체인 어딘가 존재하는지 판별한다.
qna
상속 구현해보자.
// without Object.create
Last updated
Was this helpful?