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가 호출이 되는 것이다.
소스를 분석하면서 느낀것이지만, 한줄 한줄의 의미가.. 신기하다.ㅡㅅㅡ
Posted by 장현준


