2012-04-02 6 views
0

I는 다음과 같다 코드를 아강? 단순히 공개 방법으로 만 사용하는 유일한 방법입니까? 서브 클래스의 base class 밖에 있도록프로토 타입

######## 편집 ############## OK

그래서 코드를 재 배열했습니다. BaseClass를 전달하므로 subClass는 여전히 baseClass 인스턴스의 속성에 액세스 할 수 있습니다.

var baseClass = function() { 
    var base = this; 
    this.property_a = 1; 
    this.property_b = 5; 

    var sub = new subClass(base); 
    // CODE 
} 

var subClass = function(parent) { 
    var sub = this; 
    this.property_c = 1; 
    this.method_a = function() { 
     return sub.property_c + parent.property_a; 
    } 
    // MORE CODE 
} 

이 괜찮 및 작동하지만이 프로토 타입을 사용하는 방법에 추가 할 때 지금은 새로운 문제를 가지고 :

subClass.prototype.method_b = function(){ 
    return sub.property_c + parent.property_b; 
} 

내가 부모가 정의되어 있지 않은 말하는 오류가 발생합니다.

기본적으로 나는보기 편과 편집면이있는 매우 간단한 웹 응용 프로그램을 가지고 있습니다. 보는 데 필요한 모든 것을 포함하는 기본 클래스를 만들고 다른 파일에 편집하는 데 필요한 메서드를 추가하여 사용자가 편집 페이지에있을 때만로드되도록합니다. 당신이 정말로 개인 서브 클래스를 유지하려면

+0

baseClass 내부에서 subClass.prototype.newMethod를 그냥 수행 하시겠습니까? 나는 그것이 gilly3의 대답이라고 생각한다. 개인적으로, 왜 '클래스'를 정의하는 데 계속해서 메소드를 추가해야하는지 모르겠다. 왜 자바 스크립트를 그렇게 복잡하게 만드나? 그것은 단지 하나를 정의하는 것과 반대로 절차 적으로 클래스를 만드는 것과 같습니다. –

답변

1

왜 하위 클래스를 기본 클래스로 선언합니까? 나에게 이해가 가지 않는다.

범위에 속할 때마다 하위 클래스의 프로토 타입에 추가 할 수 있습니다. 귀하의 코드에서 될 것이라고

var baseClass = function() { 
// CODE 
    var subClass = function() { 
     // MORE CODE 
    } 
    subClass.prototype = { 
     ... 
    } 
} 

그러나 나는 기본 클래스 생성자 밖으로 넣어 제안했다. 당신이 어떤 이유로 비공개 원하는 경우, 클로저를 추가

아, 서브 클래스의 base class에서 상속되지 않습니다

(function(){ 

    baseClass = function() { // public 
     // CODE 
    } 
    baseClass.prototype = {...}; 

    var subClass = function() { // private 
     // MORE CODE 
    } 
    subClass.prototype = Object.create(baseClass.prototype); 
    subClass.prototype.newMethod = function() { ... } 
})() 

EDIT는 확장 질문에 대답! 우리는 예상 했었습니다. 그렇지 않으면 생성자 내부에있는 것이 좋을 수도 있습니다.그런 다음, 같은 프로토 타입이 다른 서브 클래스의 생성자에 각각 추가되었습니다 수 : 당신은 (함수의 base class 이외의) 하나의 공통 서브 생성자를 원하는 경우 그렇지

var subproto = { 
    method_b: = function(){ 
     // manipulate "this" 
    }, 
    ... 
}; 
function baseClass() { 
    // some code 
    function sub() { 
     // is a constructor for subs which belong to this specif base intance 
     ... 
    } 
    sub.prototype = subproto; // the sub constructors of each base instance 
           // have the same prototype 
    var x = new sub(), 
     y = new sub(); // example usage of the sub constructor 
} 
baseClass.prototype = {...} 

는, 당신은 기본 인스턴스를 줄 수있는 서브에 속하는 당신이했던 것처럼 생성자에 대한 인수로서. 물론 sub (내부 및 외부 메서드)는 해당 기본 인스턴스의 public 속성에만 액세스 할 수 있습니다.

재 배열 된 코드에서 실수 한 것은 프로토 타입 ("외부") 메소드가 하위 생성자의 변수 parent에 액세스하려고했기 때문입니다. 당신이 말하는 것처럼, "부모가 정의되지 않았다는 오류".

var subClass = function(parent) { 
    var sub = this; 
    this.parent = parent; // make it public 
    this.property_c = 1; 
    this.method_a = function() { 
     return sub.property_c + parent.property_a; 
    } 
    // MORE CODE 
} 
subClass.prototype.method_b = function(){ 
    // prototype functions can only access public properties 
    // i.e. privileged methods, public attributes and other prototype properties 
    return this.property_c + this.parent.property_b; 
} 
+0

하지만 새 baseClass 인스턴스를 만들기 위해 어디에서 subClass가 필요합니까? – Bergi

+0

어? 내가 대답하는 동안 당신의 의견을 삭제하지 마라. – Bergi

+0

haha ​​미안 나는 원래의 지위를 편집했다. – synaptomy

0

, 당신은 폐쇄의 정의를 숨길 수 :

var BaseClass = (function() { 
    function BaseClass() { ... }; 
    function SubClass() { ... }; 
    BaseClass.prototype.foo = function() { ... }; 
    SubClass.prototype.foo = function() { ... }; 
    return BaseClass; 
})(); 

을 나는 개인적으로보다 가치가 더 문제가 될 수있는 폐쇄 강화 된 보호의이 종류를 발견했다 (예 : , 디버깅을 더 어렵게 만든다.) ... 그러나 만약 당신이 그것을하고 싶다면, 그렇게 할 수있다.

1

당신은 subClass를 정의하는 것과 같은 맥락에서 메소드를 정의해야합니다 :

var baseClass = function() { 
    // CODE 
    var subClass = function() { 
     // MORE CODE 
    } 
    subClass.prototype.newMethod = function() { ... } 
} 

이 가능하지 않으면, 적절한 상황에 subClass를 노출하거나 baseClass에서하는 메커니즘을 제공해야합니다 연장 subClass.