2011-01-10 3 views
4
(function() { 
    function User() { 
     //some properties 
    } 

    //private fn 1 
    User.prototype._aPrivateFn = function() { 
     //private function defined just like a public function, 
     //for convetion underscore character is added 
    } 

    //private function type 2 
    //a closure 
    function _anotherPrivateFunction() { 
     // do something 
    } 

    //public function 
    User.prototype.APublicFunction = function() { 

     //call private fn1 
     this._aPrivateFn(); 

     //call private fn2 
     _anotherPrivateFunction(); 
    } 

    window.UserX = User; 
})(); 

// 자바 스크립트 개체의 개인 메서드를 정의하는 두 가지 방법 중 어느 것이 더 좋으며, 특히 메모리 관리 및 성능이 더 좋습니다.자바 스크립트 개체의 - 개인 방법 : 어느 쪽이든 더 좋다

+0

브라우저 의존성이 높습니다. –

+0

슬프게도 두 번째 방법을 사용하면 범위 체인에서 한 단계 더 나아가 야하므로 속도가 느려질 수 있습니다. 그러나 당신은 더 많은 통제권을 얻습니다. –

답변

10

"개인 기능 # 1"은 비공개가 아닙니다. 버전 # 2는 폐쇄되어 있으므로 실제로는 User 개체를 통해서만 액세스 할 수 있습니다.

종종 "더 나은"것은 없지만,이 경우 문맥에서 클로저 된 함수는 외부 세계로부터 완전히 숨겨져 있습니다 (분명히 더 낫습니다).

클로저가 여전히 메모리 누수를 일으킨다는 루머가 있습니다. 이는 잘못된 것입니다. 클로저는 메모리 누수를 만들지 않지만 프로그래머는 할 수 있습니다. 여기 당신의 예는 완전히 좋습니다.

개인적인 방법을 사용하려면 거의 정확한 패턴을 사용해야합니다.

var myObject = function() { 
    // privates 
    var a = 5, 
     b = 10, 
     c = a, 
     public = {}; 

    public.getA = function() { 
     return a; 
    }; 
    public.setA = function(v) { 
     a = v; 
    }; 

    function privateOne() { 
    } 

    return public; 
}; 
+0

# 1은 (는) 비공개가 아닙니다. 프로토 타입을 작성하거나 클로저를 만드는 방법을 추가하는 방법 중 어느 것이 더 나은 방법인지 알고 싶습니다. –

1
JQuery와의

존 레식이 특종/프로토 타입을 만드는 방법의 훌륭한 프리젠 테이션을 가지고/당신이 절대적으로 숨기기 (또는 원하는)해야하는 경우 등

http://ejohn.org/apps/learn/

4

만들기 폐쇄가 더 상속 외부 세계의 기능.

  1. 메모리 모든 인스턴스가 동일한 (단일) 함수를 공유하기보다는 한 각을 생성하기 때문에, : 당신이 걱정하는 경우 프로토 타입

    추가 방법이 더 좋습니다.

  2. 은 닫힌 부분에 숨겨진 기능을 테스트 할 수 없기 때문에 테스트 가능성입니다.
관련 문제