콜백 함수는 객체 인스턴스의 컨텍스트에서 호출되어야한다. 현대적인 브라우저의 특정 문맥에 바인드되는 함수 반환 Function.prototype.bind
사용할 수 있습니다 : 단순한 관점에서
this.canvas.addEventListener('mousemove', this.mouseMove.bind(this));
, MyObject.prototype.mouseMove
addEventListener
에서 호출되는을, 함수 내 this
의 값은 canvas
인스턴스가 될 것입니다 . 대신 의 값을 MyObject
인스턴스로 지정하십시오.
이 문제를 해결하기 위해 실제로 호출 할 함수의 래퍼 인 함수를 전달합니다. this.mouseMove.bind(this)
this
값이 캔버스 대신 개체 인스턴스가되도록 mouseMove
함수를 래핑하는 새 함수를 만듭니다.
이 일을하는 또 다른 방법은 익명 함수 래퍼를 만드는 것입니다 :
...
var self = this;
this.canvas.addEventListener('mousemove', function (e) {
self.mouseMove(e);
});
이 형식의 단점은에 파이프 함수로 통과 얼마나 많은 인수를 알 필요가 있다는 것입니다 내부 함수 호출.
이 주위에 방법이 Function.prototype.apply
함께 :
var self = this;
this.canvas.addEventListener('mousemove', function() {
//cast arguments to an array for cross-browser compatibility
var args = Array.prototype.slice.call(arguments);
return self.mouseMove.apply(self, args);
});
이제 코드의 종류를 쓰기 많은 아웃 추상적 변수에 쉽게 방법이 실현거야, 당신이 필요로하는 모든 함수는 컨텍스트를 사용하면 래퍼를 생성 할 수 있습니다. 그것이 Function.prototype.bind
입니다.
, "이"내가 질문을 오해 할 수 있습니다 캔버스 – Carl
이지만,'mouseMouse' 방법은 캔버스 속성에 호출 할 수 없습니다 (생성자의 프로토 타입에 있기 때문에) 생성자에서 인스턴스화 된 객체 만 반환합니다. – adrichman