어제 스터디에서 가장 압권은 this 의 정체랄까? 정말 10년 묵은 체증이 내려 가는 기분이었습니다. 정말로 10년전에 이런 내용을 고민 했었습니다. 그당시 나름 지금의 jQuery UI 같은 것을 구상 했었지요. 이름하야 Forms! 하지만 수준은 전혀 다른 세계 입니다. ㅎㅎ 뭐 여튼 그때는 어디 물어 볼 때도 없이 혼자 맨바닥에 해딩 하던 시절이라 어제 스터디를 하며 문득 그때가 떠올랐습니다. 그래서 소스를 찾아보니… 있다!!! 내 낡은 하드속의 폴더~
그때 당시에는 브라우저마다 Form 모양이 다르게 나오는게 너무 싫어서 만들었는데 지금보니 참 얼토당토 않네요. 요즘 같은 세상에 필요하신 분이 없겠지만 제 사료 아카이브를 위해 남겨 둡니다. ㅎㅎㅎ
Download
[button url=’/forms/forms.zip’ target=’_blank’ size=’large’]Forms 다운로드[/button]– 어제의 복습 –
function Forms(i){ this.id = i; this.formOpen = formOpen; // 호이스팅 } function formOpen(){ console.log(this.id); } var f=new Forms(1); f.formOpen(); // 1 formOpen(); //. formOpen.call(f); //1
위는 10년전 코드입니다. formOpen 실행 시 this 가 다른 이유는 어제 배운 내용인데… 알들말듯 @,.@ 여튼 이 경우는 사실 프로토타입을 필요로 하지 않으므로 꼭 new 키워드로 생성 할 필요는 없습니다. 아래와 같이 해도 잘 작동합니다.
Forms ={ "formOpen":formOpen } function formOpen(){ console.log(this.id); } f1 = {"id":1}; f2 = {"id":2}; Forms.formOpen.call(f1); // 1 Forms.formOpen.call(f2); // 2
함수부와 데이터를 분리 할 수 있으니 데이터객체가 많은 경우 유용 할 수 있을 것 같습니다. 그럼 마지막으로 프로토타입을 이용하면 아래와 같습니다.
function AbstractForms(){}; AbstractForms.prototype = { formOpen:function(){ console.log(this.id); } }; function Forms(){}; Forms.prototype = new AbstractForms; forms = new Forms; // 프로토타입체인을 위해 반드시 new 를 사용해야 한다. f1 = {"id":1}; forms.formOpen.call(f1); // 1
헉헉헉.. 제가 제대로 이해한건지 모르겠네요. ㅎㅎㅎ 여튼 쉽지는 않지만 알아가는 재미가 있네요.