개체를 디자인 할 때는 시작할 것인지 결정해야합니다. 물체의 내부를 외부 세계에 노출시키는 것에 관심이 있습니까?
상관 없으면 실제로 모든 프로토 타입을 개체의 프로토 타입에 추가하고 모든 인스턴스 변수를 생성자 함수의 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 메서드를 만드는 것이 타당한 이유 일 수 있지만 실제로는 사용 사례에 따라 다릅니다.
귀하의 질문에 대한 답변이 없거나 다른 것에 대한 구체적인 설명이 필요하시면 언제든지 문의하십시오.
js에서 고전적인 상속을 위장하는 것에 대한 엄격하고 빠른 규칙은 없습니다. – dandavis
나는 보안에 대해 더 걱정하고있다. 현재 private 함수를 사용하여 private 멤버에 액세스/수정하고 private 함수를 호출하는 권한있는 함수를 사용하고 있습니다. 방금 권한있는 방법을 사용하면 보안에 차이가 있습니까? – FranXh
@FranXh 클라이언트 쪽이 "안전하다"고 가정하지 마십시오. –