2013-08-24 3 views
2

고유 범위가있는 prototype 함수를 만들고 싶습니다. 이를 위해 익명의 함수를 사용하지만 객체의 멤버에 액세스하는 방법을 찾을 수 없습니다.익명 함수로 액세스하기

function F() { 
    this.counter = 0; 
} 

F.prototype.increment = (function() { 
    var lastIncrementTime = -1; 
    var caller = this; // <--- it fails here because this is the Window object 
    return function(time) { 
     if (time > lastIncrementTime) { 
      caller.counter++; 
      lastIncrementTime = time; 
      return caller.counter; 
     } 
     return caller.counter; 
    } 
})(); 

f = new F(); 

f.increment(); 

나는이 F를 참조하거나 f 객체하지 않기 때문에 실패 알고 여기

내가 달성하기 위해 노력하고 무엇의 단순화 된 버전입니다.

액세스 할 수있는 방법이 있습니까?

답변

6

즉시 호출 함수 표현식 (인생) 자체가 한 번만 호출됩니다는 increment에 대한 모든 호출은 마지막으로 남았다로 변수를 사용하고 var에게이를 재하지 않습니다.

는 특정 인스턴스를하지 않습니다 call, apply 또는 bind이 예제의 맥락에서

F.prototype.increment = (function() { 
    // this === F.prototype 
    // ... 
}).call(F.prototype); 

this를 사용하여 호출 컨텍스트를 변경하지만, 프로토 타입이 될

. 실제로 인스턴스가 구축 될 때 자신의 폐쇄와 인스턴스 별 특성을 초기화하기 위해 독립적 인 기능이 조금 다른 무언가를 달성 할 같은


보인다. 이러한 유형의 작업은 약간의 메모리를 소비 할 수 있으므로 너무 많은 고유 데이터를 저장하지 마십시오. 이 예에서

function F() { 
    this.counter = 0; 
    this.__init_increment(); // create `this.increment` 
} 
F.prototype.__init_increment = function() { 
    var lastIncrementTime = -1; 
    this.increment = function (time) { 
     if (time > lastIncrementTime) { 
      this.counter++; 
      lastIncrementTime = time; 
     } 
     return this.counter; 
    }; 
}; 
var f = new F(); 
f.increment(0); // 1 
f.increment(0); // 1 
f.increment(5); // 2 

, this.increment는 각 인스턴스에 대한 상이한 고정 수단을 가지고, 각 인스턴스에 대해 다른 기능 이다. 이들은 프로토 타입으로 생성되며 인스턴스 속성을 설정합니다. 생성기는 프로토 타입에있을 필요는 없으며 인스턴스에 적용 할 때 호출 컨텍스트를 기억하십시오.

+0

인스턴스에 특정 카운터를 갖고 싶습니다. Kolink의 버전이 정상적으로 작동하는 것 같습니다. 귀하의 경우'this'가 인스턴스 특정 카운터에서 작동하지 않는 프로토 타입 객체를 참조합니다. –

+2

@MadEchet 특정 인스턴스가 필요하다면 _prostotype_이 아닌 _constructor_에 해당 인스턴스를 원할 수 있습니다. Kolink의 솔루션은 정상적으로'this'를 사용할 수있는 곳에'호출자 (caller) '를 사용하기 때문에 "작동"합니다. 그러나 그 솔루션은 여전히 ​​모든 인스턴스에서 공유되는'lastIncrementTime'을 가지고 있습니다. –

+0

사실, lastIncrementTime이 공유되었다는 것을 몰랐습니다. 감사! –

2

이 적절하게 설정된 익명 기능 내에서 var caller = this을 이동하십시오.

+1

'var called' 라인을 긁어서, 반환 된 함수 내에서'caller' 대신'this'를 사용하십시오. – bfavaretto

+0

@ Paul S.은'lastIncrementTime' 이후의 코드에서의 디자인 문제는 변수들간에 공유되므로 그의 대답을 골랐습니다. –

관련 문제