아디봉의.net
[자바스크립트] 코딩기법과핵심패턴: 코드재사용패턴#2 (펌) 본문
자바스크립트 코딩기법과 핵심패턴 제 6장 코드 재사용 패턴 #2
이 책에서는 자바스크립트에서 코드 재사용 패턴은 상속, 다른 객체와 합성, 믹스-인 객체 사용, 메서드 빌려쓰기등으로 소개하고 있다. 코드 재사용 작업을 접근할 때, GoF의 충고인 '클래스 상속보다 객체 합성을 우선시하라'를 생각하는게 중요하다.
지난 글(http://blog.jidolstar.com/795) 에서 코드 재사용 패턴중 클래스 방식의 상속에 대해서 다루었다. 나머지는 여기서 다룬다.
프로토타입을 활용한 상속
프로토타입을 활용한 상속은 클래스를 사용하지 않는 '새로운' 방식의 패턴이다.
다음과 같은 함수가 이것을 실현시킨다.
1.
2.
3.
4.
5.
6.
위 함수를 아래처럼 사용할 수 있다.
01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
11.
12.
위 코드처럼 부모를 객체 리터럴로 생성하는 것 뿐만 아니라 생성자 함수를 통해서도 부모를 생성할 수 있다.
01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
11.
12.
13.
14.
15.
하지만 주의할 것은 생성자 함수의 프로토타입 객체만 상속받게 할 수 있다.
1.
2.
3.
ECMAScript 5에는 Object.create()가 위 object() 함수를 구현하고 있다.
1.
2.
3.
4.
5.
자바스크립트 라이브러리에서 YUI3에서도 Y.Object() 메서드가 그것을 구현하고 있음을 알아두자.
책 내용에는 없지만 위 방식을 그대로 사용하는 것은 부정적이다. 이것은 여전히 전역을 더럽히기 때문에 네임스페이스 패턴이든 샌드박스 패턴이든 사용해 전역을 최소화할 필요가 있겠다. 하지만 기존 클래스 방식의 상속보다 훨씬 간단하면서도 매끄럽게 재사용 패턴을 적용할 수 있다는 점은 크게 매력적이다.
프로퍼티 복사를 통한 상속패턴
아래는 얕은 복사 방식이다.
01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
아래 코드는 프로퍼티 깊은 복사를 통한 상속 패턴 적용 함수이다.
01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
위 함수들은 아주 간단하고 널리 사용된다고 한다. 그리고 jQuery의 extend() 메서드는 깊은 복사를 하고 Y.clone() 깊은 복사를 수행하면서 함수도 복사해 자식 객체와 바인딩 해준다고 한다. 이 패턴은 프로토타입을 전혀 사용하지 않은 것도 주목할 만하다.
하지만 내 생각에.... 깊은 복사를 하는 과정에서 extendDeep()을 재귀적으로 호출하고 있다. 이 점은 자바스크립트 특성상 이렇게 쓰는 경우 스택오버가 걸릴 가능성이 농후하므로 뭔가 비동기적으로 동작하도록 만들 필요가 있다.
게다가 배열이 for-in 루프로 요소를 탐색하는 것은 2장 기초에서 다루었듯이 for 루프를 사용하는 것이 맞다.
믹스-인
프로퍼티 복사 아이디어를 발전시켜 믹스-인 패턴을 생각할 수 있다. 이것은 하나의 객체를 복사하는게 아니라 여러 객체를 복사해 하나의 객체에 섞어 넣을 수 있다.
01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
11.
12.
13.
14.
15.
16.
17.
18.
결과적으로 아래처럼 나온다.
butter: 1
eggs: 2
large: true
salted: true
flour: "3 cups"
sugar: "sure!"
믹스-인 개념에는 단순히 루프를 돌고, 프로퍼티를 복사하는 것이기 때문에 부모들과의 연결 고리는 끊어진 상태이다.
개인적인 이 패턴에 대한 생각을 남기면... 위 mix() 메서드는 여러개의 객체중에 프로퍼티 이름이 중복되면 마지막에 들어간 것이 기존에 있는 것을 덮어쓰게 될 것이다.
게다가 다음과 같은 경우에는 대응하지 못한다.
01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
11.
원래 기대하는 바는 cake.array.toString()의 경우 "1,2,3"이어야 할 것이다. 즉, 배열값에 대해서는 얕은 복사를 했으므로 깊은 복사를 할 수 있도록 개선해야한다.
메서드 빌려쓰기
메서드 빌려쓰기 재사용 패턴은 정말 자바스크립트의 특징을 대변해주는 패턴일 것이다. 이 패턴은 부모-자식 관계까지 만들지 않고 어떤 객체의 메서드 한두개만 빌려쓰는데 유용하다.
책 내용중에는 apply와 call을 사용해 bind를 구축하는 방법과 this문제를 잘 다루었다. 마지막에 ECMAScript 5부터 지원하는 Function.prototype.bind() 메서드를 사용하면 된다고 했다. 하지만 이 메서드가 지원되지 않은 경우도 감안해서 아래와 같은 코드를 쓰면 언제든지 bind()를 활용할 수 있게 된다.
01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
메서드 빌려쓰기 패턴은 잘쓰면 꽤 유용할 듯 싶다.
'JAVASCRIPT' 카테고리의 다른 글
[자바스크립트] 코딩기법과핵심패턴: 코드재사용패턴#1 (펌) (0) | 2013.05.25 |
---|---|
[자바스크립트] 코딩기법과핵심패턴: 객체생성패턴 (펌) (0) | 2013.05.25 |
[자바스크립트] 코딩기법과핵심패턴: 함수 (펌) (0) | 2013.05.25 |
[자바스크립트] 코딩기법과핵심패턴: 리터럴생성자 (펌) (0) | 2013.05.25 |
[자바스크립트] 코딩기법과 핵심패턴: 기초 (펌) (0) | 2013.05.25 |