어제도 무척이나 덥더니, 오늘도 매한가지군요;; 집에 에어컨이 없는관계로 너무나 더운 초여름을 맞이하고 있습니다. 어제 새벽엔 개인적인 사건사고가 끊이지 않아~ 피곤한 밤이기도 했습니다. ㅎㅎ
오늘은 저번 강좌에서도 밝혔듯이 bind 개념의 후속타인 extend에 대해서 알아볼까 합니다. PJS에서 extend의 개념은 두가지로 쓰이고 있습니다. 하나는 확장이며, 다른하나는 상속입니다. 어찌보면 두개의 개념이 같을 수도 있습니다. 같은 행동을 취하지만 개념은 다르다라고 말씀드리는게 더 정확하다고 말하고 싶군요.
Object.extend = function(destination, source) {
for (var property in source) {
destination[property] = source[property];
}
return destination;
}
먼저 extend의 소스부터 보시죠. 감이 오시나요? 그렇습니다. 마냥 읽어서 shallow copy를 하고 있습니다.
Shallow copy는 일명 '얕은 복사'입니다. 얕은 복사는 대상 오브젝트를 참조하는 참조변수로부터 복사되어지는 변수만을 가지는 복사를 말합니다. 이해가 잘 안가신다구요? 그렇다면 저~ 뒷쪽에 변수의 scope를 설명하는
부분을 참고하시면 이해가실겁니다. shallow copy의 반대는 뭘까요? 그렇습니다 deep copy(깊은 복사)입니다. 너무 쉽죠? 깊은복사는 말그대로 객체를 복사할때 참조변수가 주소값만을 가지는게 아니라 새로운 객체자체를 가지는것을 말합니다. 이쯤하면 shallow copy와 deep copy가 구분되어지리라 생각합니다.
음, 제가 말하고 싶은건 'extend는 shallow copy다' 라는 것입니다. ㅎㅎ
그럼 다시 extend의 목적인 두가지를 알아보겠습니다.
첫번째, '확장'입니다.
확장이란 말그대로 무언가를 넓히는 것입니다. 그게 개념이든 메소드이든 말이죠. 그럼 확장의 extend를 언제
사용할까요? 바로 객체의 메소드 및 프로퍼티를 추가할 때 입니다. 이해가시죠? 어느 객체에 필요한 프로퍼티와 메소드들을 추가하여 없던 기능들을 넣음으로써 확장하는 것입니다. 이것을 PJS에서는 아래와 같이 사용하고
있습니다.
Object.extend(Hash, {..toQueryString : function(){}..toJSON : function(){}...})
처음에 Hash를 생성할 당시에는 toQueryString이란 메소드가 없다가 확장을 통해 메소드를 추가하는
모습입니다.
두번째의 개념은 '상속'입니다.
상속이란 확장의 확장편이라고 해야할까요? ㅎㅎ 그냥 의미그대로 해석해보겠습니다. 상속이란 위에서 그냥
내려받아 내것처럼 사용하는 것을 말합니다. 쉽게 저는 빵을 못만들지만 아버지가 빵을 만드는 방법을
알고있다면, 자식인 제가 아버지의 재능을 상속받아 저또한 빵을 만들 수 있다는 이야기 입니다.
이해가 가시는지요. 그럼 PJS에서는 어떻게 상속의 개념을 설명하는지 코드를 보겠습니다.
Object.extend(Hash.prototype, Enumerable)
아주 심플하군요. 소스설명은 Hash 오브젝트가 Enumerable이 사용하는 메소드들을 상속받아서 Hash에서도
사용할 수 있다는 이야기 입니다. 상속이란 이런 개념인거죠. 내가 못하는거 상속받으면 상속해준 것의 행동을 할 수 있다. 이해가 되시죠? 그렇습니다. 그렇게 어려운 개념이 아닙니다.
오늘은 여기까지 작성토록하고 다음 강좌에서 다시 만나겠습니다.
posted by blankus
이 글의 트랙백 주소 :: http://www.blankus.net/trackback/15