2011-10-17 4 views
2

나는 최근에 자바 스크립트 프로그래밍을 시작했고 모든 것이 좋을 것이라고 생각했다 ... 글쎄, 오늘 나는 스스로 해결할 수없는 문제에 직면했다. 튜토리얼/학습 프로젝트에는 모델이라는 클래스가 있습니다. 이 클래스에는 private 변수와 public 변수가 있습니다. 이 변수의 유형은 CustomEvent입니다.자바 스크립트 : 동일한 클래스의 공용 변수에 액세스하는 방법은 무엇입니까?

 function Model(){ 
     /** 
     * Array in which the questions are stored 
     */ 
     var questions=new Array(); 
     var db; 
     var valuesSplit="*"; 
     var tableName="quests"; 
     this.myEvent=new CustomEvent("my event"); 

"myEvent"는 공개되어 있으며 외부에서 호출 할 수 있습니다. 이 경우 구독 할 수있는 이벤트이며 (이 클래스 외부에서는 듣고 싶은 다른 개체에서 수행됩니다.) 해고 될 수 있습니다 (동일한 클래스에서 수행됨). 그리고 이것이 내 문제입니다. 모델 클래스 내에서 myEvent에 액세스하려면 어떻게해야합니까?

this.myEvent.fire() 

과 :

나는 시도

myEvent.fire() 

을하지만 난 항상 "myEvent가 정의되지 않은"얻을. 그러나

function Model(){ 
    this.myEvent = 'some value'; 
    this.canAccessEvent = function(){ 
     return 'myEvent' in this; 
    } 
} 

var m = new Model(); 
// access from outside : 
alert(m.myEvent); 
// access from inside : 
alert('Model can access the even? ' + m.canAccessEvent()); 

, 당신 new CustomEvent 기능이 존재하지 않는 것이 매우 가능 또는 유효한 오브젝트 메이커를 반환하지 않는 :

+1

정확히 this.myEvent.fire() 또는 myEvent.fire()를 쓰고 있습니까? this.myEvent.fire() 클래스의 함수 안에 writting하는 경우 해당 코드를 공유하십시오. – Vishwanath

+0

답장을 보내 주셔서 감사합니다! 그것은 그 선언의 바로 밑과 그 반원의 공공 기능 안에서 직접 시도했다. 아무것도 나를 위해 일한 – battlepope

답변

6

되는 말을 먼저 : 자바 스크립트 아무튼 수업이 없습니다. "자바 스크립트 클래스"에 대한 생각을 멈 추면 빠를수록 좋습니다. :-) JavaScript에는 OOP가 있지만 클래스에는 종류가 없습니다. Model 함수는 생성자 함수이라고합니다.

당신과 this 호출하는 함수 ( this   — 예를 들어, 당신이 그것을 설정하는 방법을 통해) 생성자 코드를 포함 new Model에 의해 생성 된 개체에 대한 참조를 가지고있는 코드에서 myEvent에 액세스 할 수 있습니다

(물론, someObjReference.myEvent을 통해 "외부 적으로") 해당 객체를 참조하십시오.

아마도 this.myEvent.fire()이 원하지만 코드를 호출하는 사람에게 올바른 this 값이 없기 때문일 수 있습니다.그 이유는 JavaScript에서 this이 전체적으로 에 의해 제어되고이 아닌 이 아닌 함수가으로 정의되어 있기 때문입니다. 자세한 내용은 내 블로그 기사 Mythical methodsYou must remember this을 참조하십시오. 그러나 아래에서 다소 잘 렸습니다. barthis가와 객체 참조로 호출하면 그에만 작동

function Foo() { 
    this.myEvent = new CustomEvent("my event"); 
} 
Foo.prototype.bar = function() { 
    this.myEvent.fire(); 
}; 

// Usage: 
var f = new Foo(); 
f.bar();   // Fires the event indirectly, via the code in `bar` 
f.myEvent.fire(); // Fires it directly 

하는 것으로 다음과 같습니다

모든 인스턴스가 공유하는 유용한 방법과 생성자 함수를 설정하는 매우 표준적인 방법의 예 myEvent 속성 그것은 완전히 다른 bar로 설정 this 뭔가 전화를 쉽게 :
document.getElementById("someID").onclick = f.bar; 

클릭이 발생

가의 bar 함수가 호출됩니다,하지만 하지Model를 통해 생성 된 객체를 참조 this 않습니다. 실패 ... bar

this.myEvent.fire(); 

에 그리고이 선 (그것은 ID 대신 "someID."로 요소를 참조합니다).

클래스 기반 언어에 익숙하다면 Java, C# 또는 C++과 완전히 다른 점을 알 수 있습니다. 이 langauges에서 안에 bar은 항상 new Model을 통해 생성 된 개체를 나타냅니다. 자바 스크립트는 그리 부끄럽지 않고 강력합니다.

이러한 유연성 (특정 개체에 한정되지 않음)은 JavaScript에서 익숙해지고 활용하기 위해 가장 중요한 것 중 하나입니다. 다른 하나는 기능이 인 폐쇄 방법입니다.은 강력하지만 not complicated입니다.

따라서 함수가 호출되는 방법에 따라 this이 설정되면 어떻게해야합니까?

  1. 전화 통화와 같은 표현의 개체 속성에서이를 참조하여 기능 : 두 가지 방법이 있습니다. 즉 이렇게 말하는 어색한 방법 :

    var f = new Foo(); 
    f.bar(); // <== The key bit 
    f["bar"](); // <== Also works 
    

    표현 f.bar() 상호 작용하는 두 가지를 수행합니다 (이 수행하는 첫 번째 일은 f에 의해 참조 된 객체의 특성 bar를 검색하고 해당 속성의 값을 얻을 수있는 함수 참조). 그런 다음 은 (() 때문에) 해당 기능을 호출하는을 호출합니다. JavaScript가 작동하는 방식은 동일한 전체 표현에서 두 가지를했기 때문에 bar로 전화하는 동안 this에서 f으로 설정됩니다. 그러나이 키 차이주의 :

    var f = new Foo(); 
    var b = f.bar; 
    b(); // <== Different! 
    
    이제

    bar 함수가 호출 될 때, this이 (가 브라우저에서 window입니다 전역 객체로 설정됩니다) f로 설정되지 않습니다를 우리 때문에 속성 검색을 함수 호출과 분리했습니다.

  2. 또는 JavaScript 기능 개체 인 callapply 기능의 기본 제공 기능을 사용할 수 있습니다. callapply은 정확히 똑같은 일을합니다. 그 차이점은 함수에 대한 인수를 제공하는 방법뿐입니다. 예 :

    var f = new Foo(); 
    f.bar(1, 2):  // <== Calls `bar` with `this` === `f` and passing in 
            //  the arguments 1 and 2 
    var b = f.bar; 
    b.call(f, 1, 2); // <== Does the same thing as f.bar(1, 2) 
    var args = [1, 2]; 
    b.apply(f, args); // <== Does the same thing as f.bar(1, 2) 
    

    는 예를 들면, callapply은 당신이 함수를 호출 할 때 this명시 적으로을해야 무엇을 설정할 수 있습니다. 그 (것)들의 유일한 다름은 callcall에 추가 논쟁으로 기능을주기 위하여 논쟁을 받아들이고, apply가 그 (것)들을 배열로 받아들이 기 때문이다.

+1

+1 "일찍 당신은"자바 스크립트 수업 "을 생각하면 멈출수록 좋을 것이다 :-) 자바 스크립트는 OOP를 가지고 있지만 수업을 가진 종류는 아니다.", 가장 기억하기 쉬운 방법 이것은 "데이터를 전달할 수있는 행동으로서의 자바 스크립트 기능을 생각하십시오."...... 데이터와 행동이있는 클래스로 생각하기보다는 ... – Vishwanath

+0

와우. 도움이되었습니다. 대단히 감사합니다. Javascript는 실제로 내가 아는 다른 언어와 많이 다릅니다. 사실 나는 그 뒤에있는 모든 구조를 이해하기가 정말 힘들다는 것을 알게되었습니다./ – battlepope

+0

@ user999041 : 다행히 도왔습니다. 예, 클래스 기반 언어에 익숙하다면 JavaScript는 비슷하지만 기능이 다르게 보입니다. (프로토 타입 언어에 익숙하다면 JavaScript는 다르게 보이지만 비슷하게 동작합니다.) –

0

myEvent 부재는 두 물체의 내부 & 외측 영역에 표시되어야 이되도록 myEvent 변수를 변경하십시오. myEvent 속성에 다른 값을 지정하고 속성이 정의되어 있는지 확인하는 것이 좋습니다. 정의 된 경우 문제는 CustomEvent 함수에 있습니다.

1

당신은 당신이 당신의 모델의 this 참조를 사용하지 않는 myEvent 또 다른 참조를 생성하는 것보다 당신의 Model에 비 공공 기능에 myEvent을 사용합니다. 다른 함수의 thisModel 함수의 다른 것입니다. 당신이 당신의 Model에 새로운 변수 정의하면이 문제를 우회하는 가장 쉬운 방법은 다음과 같습니다

var that = this; 

그런 다음 당신이 호출 할 수 있습니다 당신의 myEvent 같은 : 아마

that.myEvent 
관련 문제