2014-10-08 5 views
1

누구든지이 코드에 문제가 있다고 조언 해 주실 수 있습니까? 생성자에 설정된 변수는 객체 생성시에만 액세스 할 수 있지만 일단 객체의 메서드 중 하나를 호출하면 해당 변수에 더 이상 액세스 할 수 없습니다.생성자에서 변수를 설정할 수 없습니다.

function Animal(name) { 
     this.name = name 
} 

Animal.prototype = (function() 
{ 
    var i = 0; 
    var sitdown = function() { 
         console.log(this.name + ' sits down.'); 
         standup(); 
        }; 
    var standup = function(){ 
         console.log(this.name+' stands up'); 
         if(i != 10) 
         { 
         i++; 
         sitdown(); 
         } 
        }; 
    return { 
     standup: standup 
    } 
})(); 

var Tiger = new Animal("Tiger"); 
Tiger.standup(); 

출력 :

Tiger stands up 
sits down. 
stands up 
sits down. 
....... 
....... 
stands up 
sits down. 
stands up 
+1

문제는 sit.sitdown() 대신 sitdown()을 호출하는 것입니다. funtion은 "this"가 무엇인지에 대한 정보를 잃어 버리며 더 이상 이름을 검색 할 수 없습니다. Tiger.standup()을 호출하기 때문에 첫 번째 호출에서 작동합니다. 이 함수는 Tiger에서 이것을 호출한다는 것을 알고 있습니다. –

+0

왜'standup.call (this);'을하지만'sitdown(); 만합니까? – Bergi

+0

사과 그것은 단지 실수 였어. 나는 객체에 접근하는 다른 접근법을 시도하고 있었다. – Wracker

답변

2

하면 어느

  • 호출 함수 방법 구문을 사용하는 경우에는 '이'만, 오브젝트 참조를 포함하고, 예를 들어 this.sitdown()
  • 또는 sitdown()에서와 같이 call()/apply()를 사용하여 호출합니다 (standup.call(this)).

standup() 메서드는 sitdown()을 메서드가 아닌 함수로 호출하며 작동하지 않습니다.

+0

'sitdown'을 프로토 타입에 노출시키지 않으면'this.sitdown()'이 작동하지 않습니다. –

+0

사실, sitdown()에 call()이 필요합니다. –

+0

솔루션 감사합니다. 그래서 .call (this)을 스탠드 업 및 시트 다운 메서드에 추가했으며 현재 예상대로 작동하고 있습니다. – Wracker

1

standup의 첫 번째 호출을 제외하고 thisTiger이 아니라 창을 가리 킵니다. 문제는 standupsitdown()이라고 부르는 것입니다. 대신 sitdown.call(this)으로 전화해야합니다.

관련 문제