문제

JavaScript에서 조금 읽은 후 프로토 타입 상속 모델, 나는 수업을 구축하는 내 스타일을 바꿉니다.

var Some_Class = function() {
    this.public_method = function() {
    };
    (function() {
        // constructor
    }).call(this)
}

에게

var Some_Class = function() {
    (function() {
        // constructor
    }).call(this)
}
Some_Class.prototype.public_method = function() {
};

나는 이것이 좋은 관행이라는 것을 이해하지만 더 이상 공개 방법에서 개인 방법에 액세스 할 수는 없습니다.

var Some_Class = function() {
    var private_member = 'whatever';

    (function() {
        // constructor
    }).call(this)
}
Some_Class.prototype.public_method = function() {
    return private_member; // not possible
};

기사를 읽은 후 여기 (폐쇄 제작 생성자), 나는 이것으로 나왔습니다.

var Some_Class = function() {
    var private_member = 'whatever',

    private_method = function(_some_value) {
        // private method implementation
    };

    if(!arguments.callee.prototype.public_method) {
        arguments.callee.prototype.public_method = function() {
            private_method.call(this, private_method);
        };
    }

    (function() {
        // constructor
    }).call(this)
}

그러나이 작업의 단점은 무엇입니까?! 아니면 액세스하고 싶다면 더 좋은 방법이 있습니까? 개인 회원 공개 방법으로?

도움이 되었습니까?

해결책

개인 변수/함수를 시뮬레이션하기 위해 함수 범위 변수 및 클로저의 사용은 JavaScript 커뮤니티에서 잘 확립 된 관용구입니다. 변수가 진정으로 비공개 인 경우이 접근법에 대한 단점은 보이지 않습니다 (일부 브라우저/호스트의 수행자 코드는 얼마나 많은 클로저가 생성되는지에주의를 기울여야한다고 주장하지만).

예를 들어, public_method (및 환경)는 모든 객체에서 공유됩니다. Public_Method 클로저는 객체가 처음 구성 될 때만 생성되기 때문에 (생성 된 객체의 내부 프로토 타입 체인을 설정하는 생성자의 프로토 타입 속성에 결합) - 사용되는 private_method는 처음으로 만들어진 것입니다.

다음은 현재 진행중인 작업을 설명하는 데 도움이되는 샘플 코드입니다.

  var global = 1;

  var Some_Class = function() {
    var private_method = 'whatever';
    var now = ++global;
    print("outer now: " + now );
    private_method = function(_some_value) {
        // private method implementation
        print("inner now: " + now);
    };

    if(!arguments.callee.prototype.public_method) {
        arguments.callee.prototype.public_method = function() {

            private_method.call(this, private_method);
        };
    }

    (function() {
        // constructor
    }).call(this)
}

new Some_Class().public_method(); // outer now: 2, inner now: 2
new Some_Class().public_method(); // outer now: 3, inner now: 2
new Some_Class().public_method(); // outer now: 4, inner now: 2

그것이 당신이 원하는 것이라고 확신합니까?

Private_Method가 Enclosing Object의 상태를 언급 할 필요가 없다면, 나는 당신이하는 방식으로 일을하는 데 거의 도움이되지 않습니다.

내가 일반적으로하는 일 (객체를 만들기 위해 '새'를 사용해야한다면)은 다음과 같습니다.

function MyClass() {
  var private_var = 1; 
  function private_func()
  {

  }
  this.public_func = function() 
  {
     // do something
     private_func();
  }
  this.public_var = 10;
}

var myObj = new MyClass();

이 접근법의 단점은 '새'를 통해 객체를 구성 할 때마다 모든 클로저를 재현한다는 것입니다. 그러나 프로파일 러 가이 디자인 선택을 최적화해야한다고 말하지 않으면 단순성과 명확성을 선호합니다.

또한 다음을 수행하는 귀하의 코드에서 이점이 보이지 않습니다.

  (function() { }).call(this);  // call the constructor

생성자에 별도의 범위를 만드는 이유는 무엇입니까?

다른 팁

내 대답은 대답이 아닌 것입니다 : 내장이 없습니다. private JavaScript로 액세스하지만 괜찮습니다 야그니. 내가 만드는 방법은 다음과 같습니다 private 내 코드의 회원 :

function Some_Class() {
    this._private_member = 'whatever';
}

Some_Class.prototype._private_method = function() {
};

충분히 좋습니다. 유일한 진정한 목적 일 때 후프를 뛰어 넘는 것은 실제로 가치가 없습니다. private 자신으로부터 자신을 보호하는 것입니다.

(나는 이것이 당신과 마찬가지로 마감과 프로토 타이핑의 모든 순열을 가지고 놀면서 많은 시간을 보냈다고 말하고 마침내 "나사로, 그만한 가치가 없습니다"라고 말합니다.)

당신이 그렇게하지 않았다면 이미 이것을 살펴보십시오 JavaScript 모듈 패턴,이를 통해 공개 기능 등의 개인 방법 및 변수에 액세스 할 수 있습니다.

Echoing John Kugelman : JavaScript에서 개인 회원을 만드는 것은 불가능합니다. 그것과 함께 산다. 다음과 같은 인클로저를 만들더라도 다음과 같습니다.

function SomeClass() {

   var _private = 0;
   this.public_acessor = function() {return _private};
}

모든 사용자는 여전히 다음을 작성할 수 있습니다.

SomeClass._not_private_anymore = 1;
SomeClass.public_acessor = function () {return this._not_private_anymore}; 

결국, 당신은 공개 회원이 당신이 선언 한 것과 동일하다고 믿을 수 없습니다. 누군가가 당신의 코드를 깨뜨릴 것이라면, 그는 할 것입니다! 다른 사용자는 유용하기 때문에 코드 만 중단하지 않습니다.

싱글 톤뿐만 아니라 프로토 타입으로 작동합니다. 문제는 서브 클래스 할 때가되면 내 서브 클래스가 개인에게 액세스 할 수 없다는 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top