Search Results for 'function.apply()'

ATOM Icon

1 POSTS

  1. 2007/07/20 Prototype:: Class.create() 분석 by 장현준

Prototype:: Class.create() 분석

Prototype 소스를 분석하다 보니 아래와 같은 소스가 나왔다.

var Class = {
	create: function() {
		return function() {
			this.initialize.apply(this, arguments);
		}
	}
}


코드는 전체적으로 간단한데, 여기서 사용되는 apply가 무슨 역할을 하는 함수일까?

일반적으로, 함수를 호출할 때

function f1(arg1, arg2) {
	f2(arg1, arg2);
}

function f2() {
	alert(arguments.length);
}


와 같이 호출한다. 이 때, 만약 f1의 인자가 가변이라면 어떨까?

function f1(arg1, arg2, arg3) {
	f2(arguments);
}

function f2() {
	alert(arguments.length);
}


라고 하면?
f2에 첫번째 인자가 Array형으로 들어가지는 바람에, length의 값은 3이된다.

그래서 이것을 해결하고자! (물론 이것만 해결하는게 아니라, this까지 넘겨주어서 타겟 메소드가 현재 객체의 메소드같이 수행되는 역할도 한다)

function f1(arg1, arg2, arg3) {
	f2.apply(this, arguments);
}

function f2() {
	alert(arguments.length);
}


라고 표현을 한다. 이러면 arguments라는 배열이 f2를 호출할 때 각각의 인자로 쪼개져서 들어간다.

이렇게 하면, 해당 객체의 initialize를 호출해서 초기화 하는 과정이 끝났다.
그렇다면 어떻게 생성자가 호출이 될까?

그 비밀은 Class 객체 안의 create 메소드를 보면 정답이 있다.

create 메소드는 function() 을 리턴하는데, 이는 함수의 포인터를 리턴한다.
이 함수의 포인터는 "생성자를 호출해주는 함수" 를 가리키고 있다. 따라서 이 함수의 포인터를 실행하면 생성자가 호출이 되는것이다.
이 함수의 포인터는 어디에 있을까?
바로 여기다!

var PeriodicalExecuter = Class.create();


이렇게 하면 PeriodicalExecuter변수에는 생성자를 실행해주는 함수의 포인터가 담겨진다.
즉, 결론은 create를 실행하는 시점에서는 생성자가 호출되지 않으며, 나중에 호출되는것이다!

그렇다면 이 함수의 포인터는 언제 실행할까? 바로

var myInstance = new PeriodicalExecuter();


를 호출 할 때 실행되는것이다. 이때 new는 익히 잘 알고 있듯 PeriodicalExecuter()를 실행한 결과를 메모리에 할당시킨 후 그 결과를 myInstance에 넣어주는 역할을 한다.
따라서 결과적으로 이 때 initialize가 호출이 되는 것이다.

소스를 분석하면서 느낀것이지만, 한줄 한줄의 의미가.. 신기하다.ㅡㅅㅡ

크리에이티브 커먼즈 라이센스
Creative Commons License

Posted by 장현준

2007/07/20 11:38 2007/07/20 11:38
, ,
Response
No Trackback , No Comment
RSS :
http://b4you.net/blog/rss/response/123


블로그 이미지

빗소리를 먹는 사람.

- 장현준

Notices

Archives

Authors

  1. 장현준

Recent Trackbacks

  1. 듀얼클러치의 생각 rsvin28's me2DAY 2009

Calendar

«   2012/02   »
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29      

Site Stats

Total hits:
158025
Today:
95
Yesterday:
228