2013-04-24 3 views
0

JavaScript로 가상 클래스와 프로토 타입을 처음 접했고 제대로 구현하기가 어려웠습니다. 내가 뭘 하려는지 일부 필드와 기본 '클래스'가 다음 개체 리터럴로 정의 된 내 메서드를 사용하여 기본 클래스의 프로토 타입을 만듭니다. 나는이 방법을 쓰는 것에서 벗어나 내 메서드의 기본 클래스 내에서 싱글 톤을 사용하는 것 사이에 찢겨 버렸다. 나는이 방법을 이렇게하는 것이 좀 더 우아하다고 생각하지만 새로운 개체를 만들 때마다 모든 메서드를 실제로 만들지는 않는다고 생각합니다.JavaScript 프로토 타입 작업 및 기본 클래스 필드 액세스.

어쨌든 작은 문제는 내 메서드에서 기본 클래스의 필드를 참조하는 것입니다. 왜냐하면 this.field로 참조하려고 할 때 이것은 현재 함수/범위를 가리키는 것이지만 새로 작성한 객체를 참조하기를 원합니다. 이 문제가 해결되었거나 방법을 변경하는 방식을 변경해야합니까?

아래 코드는 내가하고있는 일과 내가 겪고있는 문제를 명확하게 해줄 것이라고 생각합니다.

function BaseClass() { 
    this.items[]; 
    this.fieldOne = "asdasd"; 
} 

BaseClass.prototype = { 
    methodOne: function (input) { 
     function addElement(a. b) { 
      var element = {}; 
      element.prop1 = a; 
      element.prop2 = b; 
      //The issue I am having is that items is undefined, how can I refernce the parent class object. 
      this.items.push(element); 
     } 
     function traverse() { 
      //go through a list and add a bunch of elements 
      addElement("ASdasd", 324); 
     } 
    }, 
    methodTwo: function() { 
     //see now fieldOne is asdasd 
     console.log("fieldOne" + fieldOne); 
    } 
} 

var forTest = new BaseClass(); 
forTest.methodTwo(); 

는 그래서 그래 내가 어떤 방법에서 액세스 할 수있는 상위 클래스의 일부 필드를 갖고 싶어,하지만 난 모든 메소드마다의 I를 작성하지 않도록 차라리 그냥 내 기본 클래스의 기능을 붙이지 않을 겁니다 BaseClass에서 새 객체를 만듭니다. 이 문제를 해결할 수있는 방법이 있습니까?

도움을 미리 감사드립니다.

+0

때마다 모든 방법을 만드는 "발생하지 않습니다 : 사실

methodOne: function (input) { var that = this; function addElement(a, b) { ... that.items.push(element); } } 

가 전역 객체에 바인딩 된이에 대한 ususal 해결 방법은 같다 ". – Alnitak

+0

"트래버스"기능은 어디에서 어떻게 호출합니까? – Bergi

+0

@Alnitak 예, 그게 바로 내가 피하려고하는 것입니다. 죄송합니다. 제가 잘못 말하면 죄송합니다. 메소드를 호출 할 때만 새로운 객체가 생성 될 때마다 모든 메소드를 생성하고 싶지 않습니다. – recneps

답변

2

내포 된 기능 내에서 this에 대한 참조가 손실됩니다.

methodOne: function (input) { 
    var self = this; 
    function addElement(a. b) { 
     var element = {}; 
     element.prop1 = a; 
     element.prop2 = b; 
     //The issue I am having is that items is undefined, how can I refernce the parent class object. 
     self.items.push(element); 
    } 
    function traverse() { 
     //go through a list and add a bunch of elements 
     addElement("ASdasd", 324); 
    } 

    // You never called anything? 
    // is traverse() what you wanted? 
    traverse(); 
}, 
+0

예, 이것은 내가 필요로하는 정확한 작업이었습니다. 도와 줘서 고마워. 그것은 간단했습니다. 저는 솔루션을 보지 못했습니다. 그래, 내 풀 코드가 아닌 걸 부른 적이 없어. 다시 한번 감사드립니다. – recneps

1
methodOne: function (input) { 
    function addElement(a. b) { 
     var element = {}; 
     element.prop1 = a; 
     element.prop2 = b; 
     //The issue I am having is that items is undefined, how can I refernce the parent class object. 
     this.items.push(element); 
    } 

여기서 문제는 당신이 하위 function에서 this가 잘못된 개체에 바인딩되어 있다는 것입니다 자바 스크립트 설계 오류가 발생했습니다 있다는 것입니다 : 당신과 함께 것을 해결할 수 있습니다. 나는 새로운 객체를 생성 프로토 타입에 메서드를 추가

var o = { 
    f : function(){ 
    var g = function(){ 
     this.name = "test"; 
    }; 
    g(); 
    } 
}; 
o.f(); 
console.log(name); // "test" 
+1

Javascript의 'this'범위는 디자인 오류가 아니며 작동 방식을 이해해야합니다. – Alnitak

+0

JavaScript의 디자인은 * no * 함수가 모든 객체에 바인딩된다는 것입니다. – Bergi

+0

디자인상의 오류는'g '의'this'가'f'의'this'에 바인딩되어 있지 않다는 것입니다. Douglas Crockford의 javascript에서 좋은 의견을 찾을 수 있습니다. – neo

관련 문제