2016-10-07 3 views
1

윈도우 스크롤 이벤트에 이벤트 리스너가 필요하다고 가정하고이 리스너를 ES6 클래스의 프로토 타입에 대한 메서드로 저장하려고합니다. 그것은 간단합니다. 그러나 나는 또한 핸들러의 실행 횟수를 줄이기 위해 debounce 함수가 필요하다 (예를 들어 lodash에서 _.debounce()). 그래서 리스너로 사용하기 위해 _.debounce()가 반환하는 메서드에 대한 참조가 필요하므로 필요할 때 바인딩하고 바인딩 해제 할 수 있습니다. ES6 클래스로이 작업을 수행하는 가장 좋은 방법은 무엇입니까? 요점은 : 식의 결과를 ES6 구문을 사용하여 프로토 타입 메서드로 설정할 수 있습니까?ES6 클래스 : 프로토 타입 메서드로 함수 반환 설정

class MyClass { 

    constructor() { 
     this.prop1 = 0; 
     window.addEventListener('scroll', this.myListener.bind(this)); 
    } 

    // Is it possible? 
    myListener = _.debounce(() => { 
     this.prop1 = 1; 
    }, 200); 

} 
+2

클래스 정의에서 디버깅하면 디버깅 횟수가 모든 인스턴스에서 공유되므로 (단 하나의 인스턴스 만 이벤트를 볼 수 있습니다). 인스턴스에 연결하려면 생성자에 debounce를 추가해야합니다. – Matt

답변

1

당신은 인스턴스의 속성으로 바인딩 및 디 바운스 기능을 저장해야합니다

class MyClass { 
    constructor() { 
     this.prop1 = 0; 
     this.boundListener = _.debounce(this.myListener.bind(this), 200); 
     window.addEventListener('scroll', this.boundListener); 
    } 
    myListener() { 
     this.prop1 = 1; 
    } 
    something() { // called later 
     window.removeEventListener('scroll', this.boundListener); 
    } 
} 

당신은 그렇지 않으면 알 수 없습니다, 바인딩 및 인스턴스 당 방법 진동을 소거해야합니다 어느 객체가 this.prop1을 가리키고, 디 바운싱 (debouncing)은 다른 인스턴스를 방해 할 것입니다. 프로토 타입에서는이 작업을 수행 할 수 없습니다. 그러나 프로토 타입을 완전히 생략 할 수 있습니다.

class MyClass { 
    constructor() { 
     this.prop1 = 0; 
     this.myListener = _.debounce(() => { 
      this.prop1 = 1; 
     }, 200); 
     window.addEventListener('scroll', this.myListener); 
    } 
    something() { // called later 
     window.removeEventListener('scroll', this.myListener); 
    } 
} 
+0

고마워, 버기. 나는 이것을 정확하게했다. 하지만, ES6 구문을 사용하여 표현식의 결과를 프로토 타입 메소드로 설정할 수 있는지 궁금합니다. –

+0

@ MatheusDal'Pizzol : 예 :'MyClass.prototype.myListener = ;'. –

+0

안녕, 펠릭스! 고마워요! 그러나 이것은 표준 ES5 구문입니다. 내가 말했듯이, ES6 구문으로 이것을 달성 할 수 있는지 궁금합니다. –