3

내가이 문제의 문제는 내가 만들 때마다 것입니다이 방법은 잘 작동하지만

var myClass = function(){ 
     var private_field1,private_field_2; 
     var private_func1 = function(){ 
      //....... 
     } 
     //......... 
     var myObj = { 
     global_field1:2, 
     global_field2:"something", 
     global_func: function(){//......} 
     } 
     return myObj; 
    }; 
    var obj = myClass(); 

아래의 코드를 사용하여 모듈 패턴 private 멤버 필드를 정의 할 수 있습니다 자바 스크립트 모듈 패턴으로 개인 필드 회원과 상속 정의 새로운 객체 모든 기능의 복사본을 만들고

I 이하의 다른 방법을 사용하는 시도 (동일한 클래스 주 같은 함수 메모리의 모든 오브젝트는 어디에 자바 싫어) 메모리에로드되어

var myClass = (function(){ 
      var private_field1,private_field_2;//private static fields 
      var private_func1 = function(){ 
       //....... 
      } 
      //......... 
      var Constr = function(){ 
      //do something 
      } 
      Constr.prototype = { 
      //................ 
      global_func: function(){//......} 
      } 
      return Constr; 
    }()); 
var obj1 = new myClass(); 
var obj2 = new myClass(); 

하지만이 방법의 문제는 분명히 obj1, obj2가 동일한 개인 필드를 공유한다는 것입니다 (따라서 실제로는 정적입니다). 그렇다면 객체의 동일한 함수 복사본을 사용하면서 모듈 패턴으로 private 필드를 정의하는 방법이 있습니까?

위에서 언급 한 첫 번째 방법에 대한 상속을 위해 먼저 하위 클래스 내부에서 개체를 만든 다음 해당 개체를 반환해야합니다.

var ChildClass = function(){ 
     var childobj = myClass(); 
     //override or add functions to childobj 
     return childobj ; 
} 

그러나이 효과적으로 단지 ChildClass에에 BaseClass로의 목적을 포장, 그것은 보호, 개인과 진정한 자바 상속과 같은 역할을 할 수 있도록 (제 1 또는 제 2 방법) 같은를 구현하는 다른 방법이 있나요, 등 방법?

+0

가능한 중복 http://stackoverflow.com/questions/3617139/private-variables-in -inherited-prototypes) – Bergi

답변

4

아니요. JavaScript의 권한은 범위 지정 (및 그로부터 내보내기 : 클로저)을 통해서만 수행 할 수 있습니다.

권한있는 메서드이라고하는 개인 변수 (및 함수)에 액세스해야하는 함수는 생성자 내에 정의해야합니다. 프로토 타입 객체에는 공개 속성이나 다른 메서드와 만 상호 작용하는 메서드 만 정의해야하므로 결국에는 혼합 된 방식을 사용하게됩니다. 잠재적으로 방금 발견 한 정적 값과 결합됩니다.

Btw가 아닌 ​​[코드] 자체는 여러 번 복사되고 기억됩니다. 다른 범위 객체 (어휘 환경) 만 저장해야합니다.

상속은 일반적으로 부모 개체를 만들고 확장하는 대신 자식 인스턴스를 만들고 부모 개체처럼 확장하여 수행됩니다. 이것은 새로 만든 아이 applying 부모의 생성자에 의해 수행 될 수있다 :

function ChildClass() { 
    ParentClass.call(this, /* … arguments */); 

    // usual body, using "this" 
} 

또한, 아동의 프로토 타입은 부모의 프로토 타입 객체에서 직접 상속합니다. 이것은 Object.create를 통해 수행 할 수 있습니다 (기존 브라우저 shimmed해야) :

ChildClass.prototype = Object.create(ParentClass.prototype, { 
    constructor: {value:ChildClass} 
}); 
[상속 된 프로토 타입의 개인 변수] (의
+0

이렇게 효과적으로 첫 번째 방법은? – Ankur

+0

예 - 개체 리터럴을 반환하는 대신 전체 인스턴스를 만들지 만. – Bergi

+0

고마워,이 작동 할 것입니다 :) – Ankur

관련 문제