2012-08-24 3 views
0

DRY 원칙을 유지하기 위해 function.call() 호출 수를 줄이기 위해 함수의 프로토 타입을 수정하기로 결정했습니다.동일한 프로토 타입 및 컨텍스트 내의 다른 함수에서 함수 호출이

다음은 내가 현재하고있는 일에 대한 스 니펫이며 내가하려고하는 일에 대한 자세한 설명입니다.

com.domain.$ = function(s){ 
    if(!this){return new com.domain.$(s);} 

    this.selector = s; 
    this.elements = document.querySelectorAll(s); 
} 

com.domain.$.prototype = (function(){ 
    function exe(f){ 
     var e = this.elements, 
      el = e.length; 
     for(var i=0; i<el; i++){ 
      f(e[i]); 
     } 
    } 

    function addClass(c){exe.call(this,function(el){el.classList.add(c);});} 
    function removeClass(c){exe.call(this,function(el){el.classList.remove(c);});} 
    function toggleClass(c){exe.call(this,function(el){el.classList.toggle(c);});} 

    return { 
     addClass:addClass, 
     removeClass:removeClass, 
     toggleClass:toggleClass 
    } 
}()); 

나는 이것이 내가 jQuery를의 기능을 모방하려고 시도하고 매우처럼 보이는 알고 있습니다. 고의적인데, 이것은 자바 스크립트를 대체하는 것이 아니라 오히려 개인적으로 더 잘 이해할 수 있도록하기위한 것입니다. 말했다

은, 내가 뭘하고 싶은 내가 원하는 것을 할 this의 맥락 위해서는 exe.call(this[, fnc]);를 통해 exe()를 호출 할 필요성을 제거한다. 함수 바인딩 ( .bind())을 통해이 작업을 수행 할 수 있다고 믿지만, 내가 원하는 방식은 아닐 수도 있습니다. 좋아

com.domain.$.prototype.exe = function(){} 

과 전화 :

그렇게함으로써
function addClass(c){this.exe(function(){});} 

은, 그러나, 나는 내 원래의 폐쇄에 의해 제공 exe()의 개인 가시성을 잃고 나는 대신 뭔가를 할 수 있습니다 이해 암호. 가능하다면 나는 그것을 지키고 싶습니다.

내 질문에, 다음, 내가, exe.call(this의 중복 사용을 줄일 exe()this에 대한 올바른 컨텍스트를 소유 할 수있는 방법으로 내 원래의 코드 내에서 exe()를 결합하고, 개인을 유지할 수 있는지 여부입니다 클로저 내의 가시성?

이것이 달성하려는 목표를 제대로 수행하지 못하는 것 같으면 다른 옵션을 고려해보기에 더 기쁩니다.

미리 감사드립니다.

답변

1

아니요, exe()을 정의하는 순간부터 exe()을 호출하려는 인스턴스가 아직 존재하지 않습니다. 당신이 com.domain.$에 여러 통화를하려는 경우

사실, 당신은 다른 인스턴스와 exe()를 사용하기 때문에 그것은 의미가 특정 인스턴스에 exe()를 바인딩하지 않습니다. 당신이 그렇게 원한다면

, 당신은 생성자 내부의 모든 방법을 정의해야 할 것이다 당신은 프로토 타입의 모든 장점 느슨한 것 :

(function() { 
    function exe(f){ 
     // ... 
    } 

    com.domain.$ = function(s){ 
     // ... 

     var exe_ = exe.bind(this); 
     this.addClass = function(c) { 
      exe_(function(el){el.classList.add(c);}); 
     }; 
     // ... 
    }; 
}()); 

원하지 않는 경우 내가 제안을 .call을 사용하려면 exe()을 수정하여 요소 배열을 인수로 허용하고 this.elements을 프로토 타입 함수에서 전달합니다. 왜 exe()this을 사용해야하는지 알지 못합니다. 배열의 각 요소를 주어진 함수에 전달하는 헬퍼 일 뿐이며 더 일반적으로 만들면 쉽게 재사용 할 수 있습니다. 예를 들어
: 응답, 펠릭스에 대한

var com.domain.$ = (function(o) { 
    function exe(arr, f){ 
     var el = e.length; 
     for(var i=0; i<el; i++){ 
      f(arr[i]); 
     } 
    } 

    var $ = function(s){ 
     // ... 
    } 

    $.prototype.addClass = function(c){ 
     exe(this.elements, function(el){ 
      el.classList.add(c); 
     }); 
    }; 
    // ... 

    return $; 
}()); 
+0

감사합니다. 알아 두 셨 듯이 분명히 이유로 생성자 정의에서 기능을 유지하려고합니다. 당신도 알다시피, 나는'this.elements'를'exe()'에 전달할 수 있었고 이것을 고려해 보았습니다.하지만'exe (this.elements, ...) '를 중복해서 사용하지 않도록하고 싶었습니다. 스크립트 파일은 더 작습니다. – AustinP

+0

몇 가지 일은 불가능합니다 :) 가독성과 유지 보수성에 초점을 맞추고 파일 크기를 줄이기 위해 코드 마이 저는 사용해야합니다. –