2012-05-18 3 views
4

액세스 자식 방법

// Define class A 
dojo.declare("mynamespace.A",null,{ 
    myMethodA: function() { this.myMethodB() } 
}); 

// Define class B 
dojo.declare("mynamespace.B",mynamespace.A,{ 
    myMethodB: function() {} 
}); 

는 법적 범위에 this.myMethodB()를 호출하는 것입니다 ... 클래스 A와 클래스 B가 클래스 A에서 상속 클래스 B, 주어 클래스 A (부모 클래스)? 나는 이것을 소프트웨어에서 보았고 이해가되지 않는다. Java에서 A에서 B로 타입 변환하지 않으면 불가능합니다. 그러나 dojo가 다른 것입니까?

+0

기술적으로 물론 가능하다. 언어가 이것을 금지하지는 않습니다. – akonsu

+0

전역 패턴을 숨기는 AMD 패턴이있는 계획이 있습니다. 즉 전역 (오염 가능) 범위가 아닌 로컬 변수로 의존성과 참조를 가져와야합니다. dojo.has ("config-publishRequireResults")를 통해 필수 모듈에 액세스 할 수 있는지 확인하십시오. 그것은 여전히, 현재 기본 동작 – mschr

답변

1

이 질문에 귀하의 화두 this.inherited (인수)이 될 것입니다; 귀하의 질문은 현재 상속 범위에없는 메소드를 호출하기위한 것이며 실제 객체 지향 프로그래머는 무효라고합니다. 그러나 로더가 전역 범위의 모든 것을 선언 했으므로 (여전히) 가능합니다. mynamespace.X를 통해 모든 모듈에 액세스 한 다음 prototype.theMethod를 추가 할 수 있습니다.

mynamespace.B에서와 같이 상속이 있으면 A와 B의 모든 기능이 'this'로 범위가 지정됩니다. 단순하게 병합 된 해시와 같습니다 (예 : for all methods and variables in A do set instance B[key] = property A[key]).

그러나 속성이 'class'A와 B 모두에 대해 프로토 타입 화 된 경우 재정의가 발생하면 declare/construct 체인에 'super'(또는 부모 클래스, 사용자의 표기법) 호출을 허용하는 메커니즘이 있습니다).

특수 속성 생성자의 경우 상속이 [기간]을 버립니다. 한 번만 선언 된 모든 메소드에 대한

, 그것은 상속 방법이 아닌 경우, 당신은 자신의 관련을 호출 할 수 없습니다 - 그리고 그 다음 재정의를 가지고있는 방법에 대한 '이'

를 통해 액세스 할 수 있습니다, 함수 'this.inherited (arguments);' 현재 부모 클래스의 피 호출자에게 위쪽으로 하나의 진드기를 보냅니다. 확장 된 바이올린을 보자. here

var AClass = dojo.declare("mynamespace.A", null, { 
    constructor: function(args) { 
     this.overriddenMethod(); 
    }, 
    overriddenMethod: function() { 

    } 
}); 
var BClass = dojo.declare("mynamespace.B", [AClass], { 

    constructor: function() { }, 

    overriddenMethod: function() { 
     // call super before anything else is processed in this method 
     // by placing following call you can control function callflow 
     this.inherited(arguments); 
    } 
}); 

// will call A.constructor, then A.overriddenMethod 
new AClass(); 

// will call B.constructor, A.constructor, B.overriddenMethod and then 
// A.overriddenMethod via the call to super 
// in B.overriddenMethod which A.constructor 
// calls (note that A.constructor callflow 'aims' B.override not A.override) 
new BClass(); 
+0

btw 정적 사용자 공간에 관해서는이 양식을 사용하는 경향이있다 :'var AClass = declare (.,., {constructor : ...}); AClass.ENUMA = 0; ...' – mschr

0

프로토 타입 개체를 사용하여 모든 메서드를 호출 할 수 있습니다. 여기

myMethodA: function() { mynamespace.B.prototype.myMethodB(); } 

은 작업 예입니다 @akonsu 아직 언급 한 것처럼

http://jsfiddle.net/cswing/7cBJm/

1

이 기술적으로 가능하며, 따라서, 자바 스크립트의 정적 컴파일이 없다, 그러나에 패턴이 아니다 따르

var a = new mynamespace.A(); 
a.myMethodA(); // ilegal: Uncaught TypeError: Object [object Object] has no method 'methodB' 

var b = new mynamespace.B(); 
b.myMethodA() // legal 

또한 즉, 주어진 객체의 방법으로, 자바 스크립트에 지정된 범위에서 방법/기능을 실행할 수 있습니다 :

a.myMethodA.call(b); // legal as `this` inside `myMethodA` will be referencing to object `b` 

는 실질적으로, 나는 당신이 자바에서 알고있는 mynamespace.A 추상적 인 방법 myMethodB와 추상 클래스를 에뮬레이트 할 수있다 생각합니다. 클래스 mynamespace.A 서브 클래 싱 된 경우 서브 클래스는 myMethodB을 구현해야합니다. 그러나이 방법을 수행하는 것은 매우 오류가 발생하기 쉬운 내가 더 강력한 방법으로 그것을 할 것입니다 :

// Define class A 
dojo.declare("mynamespaca.A", null, { 

    myMethodA: function() { 
     this.myMethodB(); 
    }, 

    myMethodB: function() { 
     // abstract method 
     console.warn("Abstract method [myMethodB] was not implemented."); 
     // or: throw new Error("Abstract method [myMethodB] was not implemented."); 
    } 

}); 


// Define class B 
dojo.declare("mynamespace.B", mynamespace.A, { 

    myMethodB: function() { 
     // implement abstract method here 
    } 

}); 
관련 문제