다음 코드를 고려하십시오 Dog
의 인스턴스에 this
포인터 점을 가정 "특권"canWalk()
방법과 그 코드에 버그가 있습니다"특권"메소드 호출 멤버 메소드 문제
function Dog()
{
this.foo = function() {};
this.walk = function()
{
if(canWalk())
{
alert('walking');
return;
}
alert('I have no legs!');
}
canWalk = function()
{
this.foo();
return false;
}
}
var instance = new Dog();
instance.walk();
. 그것은 실제로 나를 혼란스럽게하는 전 지구 적 대상을 가리키고있는 것처럼 보입니다! 나는 클로저로 인해 생성자의 범위에서 this
에 대한 참조를 가져올 수있다. 그런 다음 "권한있는"방법으로 참조를 사용하지만 해킹처럼 보인다.
다양한 컨텍스트에서 this
포인터의 동작을 간신히 파악합니다. 개체에 "부착 된"메서드는 첨부 된 개체를 가리키는 this
을 받게된다는 것을 알고 있습니다. 예를 들어, foo.doStuff()
은 foo
인스턴스를 가리키는 this
입니다.
내가 문제가되는 것은 내가 영리하다고 생각하고 내 OBJECT에 "권한있는"방법을 만드는 것인데, 사실 내가 전역 범위에 함수를 덤핑하고있는 것처럼 보입니다! 아마도 다른 라이브러리 또는 파일에서 직접 생성 한 것이 아닌 init()
이라는 전역 메서드가있었습니다 (가능한 경우). 그런 다음 init()
이라는 "권한있는"메서드를 사용하여 작은 캡슐화 된 개체를 정의한 경우 다른 글로벌 init()
메서드를 대체합니다.
제 질문은, 그들이 속한 대상으로 범위가 지정된 "권한있는"방법 (및 해당 필드)을 만드는 가장 좋은 방법은 무엇입니까? 내 샘플 객체에 대한 다른 접근 방법으로는 사설 또는 권한있는 메소드를 제공하면서 적절한 범위를 지정할 수 있습니다. 요구 사항을 충족시키지 못하는 모호한 솔루션을 찾는 것이 아니라 최선의 방법을 찾는 것입니다.
내 원래의 게시물을 편집하는 방법을 알아낼 수 없습니다,하지만 난 깨달았다 불행한 오류가 발생하여 올바른 예제 코드를 붙여 넣지 않았습니다. canWalk() 메서드에서 "foo"메서드 호출이 있었으므로 기본적으로 canWalk()가 this.foo()를 호출하고있었습니다. 혼란에 대한 죄송합니다. –
아, 알겠습니다. 이 경우'this'는 아마'canWalk' 함수를 가리킬 것입니다. 내 예제에서'self.foo'를 사용했다면 괜찮을 것입니다. 어딘가에 아마도 편집 버튼이 있습니다 :) – Halcyon
@ 스티브 (Steve) 텍스트의 왼쪽 하단에있는 파란색 태그 바로 아래에있는 "편집"을 클릭하여 자신의 글을 편집 할 수 있습니다. 내가 설명한 내용으로 코드를 업데이트하려고 시도했지만 약간 불명확했습니다. – ErikE