2014-06-20 1 views
2

비공개를 언제 사용해야하며 JavaScript에서 권한있는 메소드를 사용해야하는지 이해하고 이해하려고합니다. 이 게시물에 따르면 Private Members in JavaScript에 따르면 개체의 비공개 멤버는 개인 메서드와 권한있는 메서드로 액세스하고 수정할 수 있습니다. getter 메소드 (private 멤버의 경우)를 작성할 때 private 또는 privileged 메소드를 사용합니까? 왜? 접근 자 (private 멤버를 수정하는 메소드)의 경우 private 또는 privileged 메소드를 사용합니까? 왜? 이 경우에 사용되는 표준 기술은 무엇입니까?JavaScript 가시성 : 비공개 및 특권 메소드 :

마지막으로 개인 변수에 액세스하기 위해 개인용 vs 권한있는 메소드를 사용하는 차이점은 무엇입니까 (개인용 메소드를 외부에서 호출 할 수 없다는 사실은 별개 임).

function ClassB(given) 
{ 

    var myVar = given; 

    function _get() 
    { 
     return myVar; 
    }; 

    this.get = function() 
    { 
     myVar = myVar + 3; 
     return myVar; 
    }; 


    } 
+1

js에서 고전적인 상속을 위장하는 것에 대한 엄격하고 빠른 규칙은 없습니다. – dandavis

+0

나는 보안에 대해 더 걱정하고있다. 현재 private 함수를 사용하여 private 멤버에 액세스/수정하고 private 함수를 호출하는 권한있는 함수를 사용하고 있습니다. 방금 권한있는 방법을 사용하면 보안에 차이가 있습니까? – FranXh

+0

@FranXh 클라이언트 쪽이 "안전하다"고 가정하지 마십시오. –

답변

3

개체를 디자인 할 때는 시작할 것인지 결정해야합니다. 물체의 내부를 외부 세계에 노출시키는 것에 관심이 있습니까?

상관 없으면 실제로 모든 프로토 타입을 개체의 프로토 타입에 추가하고 모든 인스턴스 변수를 생성자 함수의 this으로 추가해야합니다. 이 접근법은 일부 상황에서는 바람직하지 않을 수 있습니다. 이것은 특권 메소드가 들어있는 곳이며, 개인 메소드를 모방하는 클로저의 사용법입니다.

권한이있는 메서드를 만들면 앞서 언급 한 것처럼 개체의 개인 및 공용 멤버에 액세스 할 수 있습니다. 프로토 타입에 대한 권한있는 메서드와 public 메서드를 만드는 것의 큰 차이점은 개체의 모든 인스턴스에 대해 권한있는 메서드가 만들어 지지만 프로토 타입의 public 메서드는 한 번만 만들어집니다. 많은 권한있는 메소드가 있고 오브젝트 인스턴스를 많이 생성하는 경우 메모리 사용과 관련하여 이것이 바람직하지 않을 수 있음을 알 수 있습니다.

내부 기능의 일부를 외부 세계에 숨기려는 것으로 가정하므로 권한이 부여 된 방법을 사용해야합니다.

function SomeClass() { 
    // Private member 
    var _privateMember = 1; 

    // Public variable 
    this.publicMember = 1;  

    // Privileged getter method 
    this.getPrivateMember = function() { 
     return _privateMember; 
    }; 

    // Privileged setter method 
    this.setPrivateMember = function(newVal) { 
     _privateMember = newVal; 
    }; 

    // Private method that has access to '_privateMember' and 'this' 
    var _privateMethod = function() { 
     // Modify private member 
     _privateMember = 2; 

     // Modify public member 
     this.publicMember = 1; 

     // Do some other fancy processing privately 
    }; 

    this.doSomethingAwesome = function() { 
     // Do some stuff here... 

     // Call your private method maybe? 
     _privateMethod(); 
    }; 
} 

// Public methods on prototype do not have access to private methods in your constructor 
SomeClass.prototype.publicMethod = function() { 
    // Cannot access `_privateMember` 

    this.publicMember = 2; // Does have access to 'this' 
}; 

으로 : 모든 게터/세터를 들어, 특권로 정의하고 this에 추가해야합니다 (당신이 개인을 떠날 계획이라면, 그렇지 않으면 게터/세터를 만드는 이점이별로 없다) 마지막 질문에 대해 비공개 구성원을 수정하기 위해 비공개 대 특권이있는 방법을 사용하는 것에 대해 ... 당신이 말했듯이 외부 세계에서 액세스 할 수 없으므로 그렇지 않은 경우 매우 유용합니다. 개인 게터 메소드에 다른 기능을 추가하고 권한이 부여 된 메소드를 통해 외부 세계에 공개합니다. 객체의 생성자 내부에서 많은 작업을 수행하는 경우 재사용 가능한 getter/setter 메서드를 만드는 것이 타당한 이유 일 수 있지만 실제로는 사용 사례에 따라 다릅니다.

귀하의 질문에 대한 답변이 없거나 다른 것에 대한 구체적인 설명이 필요하시면 언제든지 문의하십시오.