아래의 사진에서 왼쪽은 ES5, 오른쪽은 ES6이다.
한눈에 봐도 ES6가 더 간편하고 깔끔하다는 것을 알 수 있다. 그렇다면 왜 이런 것인지, 이 참에 ES5와 ES6 클래스 문법을 비교해보고 넘어가보도록 하자.
ES6 클래스 문법에서는 간편하게 constructor
키워드를 사용하면 된다.
ES5 클래스 문법에서의 상속을 살펴보자.
ES5에서의 pseudoclassical inheritance에서는 부모 속성 값을 상속받아 사용하려면 call
, apply를 사용해야 하는데 class에서는 super
라는 키워드를 사용하면 쉽게 상속받아 사용이 가능하다.
하지만 오른쪽의 ES6 클래스 문법을 보면 extends
라는 키워드를 사용해 부모 클래스의 자식 클래스를 만들 수 있고, super
키워드를 통해 부모 클래스의 생성자 함수를 호출하여 property를 상속 받을 수 있다.
주의: 자식 클래스에서 반드시
super
함수를 먼저 호출하고 난 후에this
키워드를 사용할 수 있다. 그렇지 않으면 참조 오류가 발생한다!
올라가기, 내려가기 메소드를 제공하는 ladder라는 객체가 있다고 가정할시,
일일히 왼쪽의 코드 맨 밑 4줄처럼 ladder.up(); ladder.up(); ladder.down(); ladder.down();
를 이어서 쓰고 싶은 사람은 없을 것이다. 메소드를 연이어 호출하고자 한다면 이렇게 할 수 있다.
클래스에서의 method chaining도 위의 사다리 예시와 마찬가지로 setter등의 method에 this
를 리턴하여 메소드 체이닝을 가능하게 하자!
Composition은 기존 클래스를 새로운 클래스의 구성요소로 사용하는 경우이다.
Use Composition when the relationship is “A has an X capability.”
Use Inheritance when the relationship is “A is of X type.”
상속을 사용해야할 때와 조합을 사용해야할 때의 상황을 명확하게 구분짓는 것이 좋다.
상속을 사용하는 것이 더 적합한 경우
- 상속 관계가 'has-a' 관계가 아니라 'is-a' 관계일 때
(Rabbit은 Animal이다 vs User는 UserTaxData를 가지고 있다)
- 기반 클래스의 코드를 다시 사용할 수 있을 때
(Rabbit은 Animal처럼 움직일 수 있다)
- 기반 클래스를 수정해서 클래스 모두를 수정하고 싶을 때
(Animal이 이동 시 소비하는 칼로리를 변경하고 싶은 경우)
아래의 두 코드를 비교해보자.
EmployeeTaxData
가 Employee
의 상속을 받는 것은 적합하지 않다.
Rabbit은 Animal인 경우와는 다르게, EmployeeTaxData
는 Employee
가 아니기 때문이다.
https://typeof-undefined.tistory.com/7
https://medium.com/front-end-weekly/classless-javascript-composition-over-inheritance-6b27c35893b1