2014-02-17 3 views
5

내 네임 스페이스는 즉시 호출 된 함수 식 (IIFE)을 사용하여 작성됩니다.IIFE (JavaScript 네임 스페이스 확장)

(function ($, MyObjectName, undefined) { 
    "use strict"; 

    MyObjectName.publicFunction = function() { 
     privateFunction(); 
    }; 

    var privateFunction = function() { 
     document.write('hello'); 
    }; 

}(jQuery, window.MyObjectName = window.MyObjectName || {})); 

//이

MyObjectName.publicFunction(); 

지금 내가 다른 공개적으로 액세스 객체이 네임 스페이스를 확장하려는 공용 메서드를 호출 내 기본 구조는 같다. 여기에서 현재의 네임 스페이스 내에서 다른 IIFE를 실행하고 있습니다. 아래를 참조하십시오.

(function ($, MyObjectName, undefined) { 
    "use strict"; 

    var ExtendedObject = (function ($, ExtendedObject, undefined) { 
     "use strict"; 

     ExtendedObject.publicFunction = function() { 
      privateFunction(); 
     }; 

     var privateFunction = function() { 
      document.write('<br>hello again'); 
     }; 

    }(jQuery, window.MyObjectName.ExtendedObject = window.MyObjectName.ExtendedObject || {})); 

}(jQuery, window.MyObjectName = window.MyObjectName || {})); 

//는 확장 네임 스페이스

MyObjectName.ExtendedObject.publicFunction(); 

이 일의 '올바른'방법인가에서 공용 메서드를 호출? 그렇지 않다면 어떻게해야합니까?

답변

1

변수 범위를 포함하는 데 IIFE가 사용됩니다. 함수 본문은 실제로 어쨌든 그것을 볼 수 있기 때문에 의존성은 호출 중에 청결성을 위해서만 전달됩니다. 코드를 깔끔하게 유지하는 데 도움이되며 인식 할 수있는 패턴입니다.

그러나 IIFE 내부에서는 매개 변수 이름 외의 외부 종속성에 대한 언급을 중단해야합니다. 그렇지 않으면 깔끔한 노력이 낭비됩니다.

따라서이 패턴을 사용하여 중첩 된 네임 스페이스/개체를 만들 때 이 아닌은 전체 패턴을 반복해야합니다.

ExtendedObjectMyObjectName에 할당하고 외부 IIFE (예 : $)의 인수를 다시 사용하기 만하면됩니다.

(function ($, MyObjectName, undefined) { 
    "use strict"; 

    MyObjectName.ExtendedObject = (function() { 
     "use strict"; 

     var exports = {}; 

     exports.publicFunction = function() { 
      privateFunction(); 
     }; 

     var privateFunction = function() { 
      document.write('<br>hello again'); 
     }; 

     return exports; 
    }()); 

}(jQuery, window.MyObjectName = window.MyObjectName || {})); 

당신은 아직도 내가 아직 인생을 사용하고 있지만 수출 (공개) 기능의 객체를 구축 됨으로써 revealing module pattern의 변형을 사용하도록 변환 한 당신의 ExtendedObject에 민간 및 공공 방법을 갖고 싶어하기 때문에

및 전달 된 객체에 public 메소드를 선택적으로 연결하는 것과는 대조적으로이를 반환합니다. 내 '변형'은 메소드가 공개 될 코드를 읽을 때 명확하게 만드는 exports 변수를 사용하고 끝에있는 멤버 이름의 오류가 발생하기 쉬운 반복을 방지합니다.

ExtendedObject 내에서 JQuery 또는 MyObjectName의 모든 기능을 사용하려면 MyObjectName 앞에 window.이라는 접두어를 붙이지 마십시오. 이미 피할 수있는 길이로 종속성이 다시 도입됩니다.

회원의 개인 정보 보호를 달성하기 위해 이러한 길이로가는 것은 유행을 피우고 있습니다. 공식 JavaScript class syntax은 그들을 제공하지 않으며 생성자에서 자신을 구축하는 것은 분명히 까다 롭습니다.

모범 사례를 따르고 코드를 깔끔하게 유지하고 개체 노출 영역을 의미있게 유지하려고합니다. 이것이 최종 사용자가 코드의 해킹 가능성을 제한하거나 디자인 타임에 잘못 사용되지 않도록 보장하는 것입니까? 후자의 경우 TypeScript를 살펴 보는 것이 좋습니다. 이렇게하면 JS에 강력한 형식이 있고 비공개 멤버가있는 것처럼 코딩 할 수 있습니다. 그러나 그것은 공개 된 모든 것을 가지고있는 바닐라 JS로 바뀔 것이므로, 최종 사용자에게 프라이버시를 제공하려는 경우에는 이상적인 솔루션이 아닙니다.

희망이 있습니다.

+0

만약 OP가 vanilla JS의 대중적인 가시성에 대해 걱정한다면, 코드의 작성은 좋은 해결책이 될 수 있습니다. https://github.com/mishoo/UglifyJS2 –

+0

@TylerDurden 클로저 기반 개인 정보 보호보다 uglification이 더 바람직하다는 데 동의합니다. 대부분의 환경은 디버거에 클로저를 노출하지만 일부 확실한 난독 화는 사람들을 막을 수 있습니다. Javascript가 그 것이다. 돼지 위에 립스틱을 씌우는 데는 아무런 문제가 없습니다. 대신 sh * t로 덮으십시오! :) – Raith