2015-10-01 12 views
17

zabawy z niektórymi es6 i wpadł na problem, nie jestem pewien, jak rozwiązać. rozważyć następującees6 klasy i "to" z procedurami obsługi zdarzeń

class Foo { 
constructor () { 
    window.addEventListener('scroll', this.watch); 
} 

watch () { 
    console.log(this); 
} 
} 

wewnątrz watch, this jest przedmiotem window, jak oczekiwano. Ale jak mam się odwołać do Foo? Obecnie obejmuję to za pomocą binda this.watch.bind(this), ale chciałbym wiedzieć, czy istnieje bardziej "właściwy" sposób ES6, aby to osiągnąć.

+0

bym zazwyczaj mają „var = to ja” tylko wewnątrz Foo, ale czuje się równie paskudny. Ale pamiętaj, JavaScript nie jest językiem OO. – Ian

+0

Artykuł [ECMAScript 6: automatycznie wiążące wyodrębnione metody] (http://www.2ality.com/2013/06/auto-binding.html) przedstawia 2 rozwiązania. –

+0

Spróbuj użyć funkcji grubej strzałki do oglądania: 'watch() {() => {console.log (this)}}' –

Odpowiedz

14

Możesz użyć funkcji strzałki.

arrow function wyrażenie (znany również jako funkcja strzałki tłuszczu) ma składnię krótszy w porównaniu do ekspresji funkcji i lexically wiąże this wartość.

window.addEventListener('scroll',() => this.watch()); 
+0

to wygląda najpiękniejszego IMO.Dzięki za opinie! –

+3

Co z 'removeEventListener' ?! Użyj 'bind (this)'. Szczegółowe informacje można znaleźć na stronie http://stackoverflow.com/questions/30446622/es6-acces-to-this-with-addeventlistener-applied-on-method. – Petr

+0

Niestety, musisz ręcznie wysłać każdy parametr, jeśli to zrobisz. No cóż .. –

1

Słowo kluczowe class jest po prostu syntaktycznym cukrem dla znanego łańcucha dziedziczenia prototypów javascript. Sposób działania tego mechanizmu atrybucji jest taki sam. Po prostu myśl o klasie jako starej dobrej funkcji, która działa z tym, więc można ją przypisać temu, który użył słowa kluczowego new.

E6 zawiera mnóstwo nowych słów kluczowych, dzięki którym javascript zorientowany obiektowo jest bardziej znany. Jestem zadowolony z tego, ale wszyscy musimy pamiętać, że podstawowe części są wciąż takie same, tylko teraz z niektórych cieni dla początkujących: D

Ps: Zważywszy, że wiesz, jak this jest zdefiniowana w JavaScript, możesz użyć bez aliasu, jak np. self lub coś podobnego, mimo że jest to powszechna praktyka.

0

Czysty sposób ES6 radzenia sobie z tym (moim zdaniem) byłoby użycie nowego Proxy object. Realizacja będzie wyglądać mniej więcej tak:

class Foo { 
    constructor() { 
     let proxy = new Proxy(this, this.watch); 

     window.addEventListener('scroll', proxy); 
    } 

    watch(e) { 
     console.log(this, e.target); 
    } 
} 

bym obejmowały przykład Babel rEPL jednak tu jest zrzeczenie: Babel REPL does not support the Proxy object. Tabela kompatybilności Kangax pokazuje support in various Javascript engines.

+0

Tak, właśnie wypróbowałem to w Babel. Po prostu nic nie robi. Urgh ... był tak podekscytowany "nowym porządkiem świata" pisania czystego kodu. Wygląda na to, że moje sny są przerywane. –

+0

Ponadto, jeśli wypróbujesz go w konsoli Chrome, nie działa też niestety. Zgadnij, że to nie koniec. –

Powiązane problemy