2015-10-01 6 views
17

, играя с некоторыми es6 и сталкиваясь с проблемой, я не уверен, как ее решить. Рассмотрим следующийes6 классы и «это» с обработчиками событий

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

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

Внутри из watch, this является window объект, как и ожидалось. Но как я могу обратиться к Foo? В настоящее время я обойду это с привязкой this.watch.bind(this), но мне было бы интересно узнать, есть ли более «правильный» ES6 способ добиться этого.

+0

Я обычно имеют «уаг сам = это» только внутри Foo, но он чувствует себя одинаково противно. Но помните, что JavaScript не является языком OO. – Ian

+0

В статье [ECMAScript 6: автоматическое связывание извлеченных методов] (http://www.2ality.com/2013/06/auto-binding.html) представлено 2 решения. –

+0

Попробуйте использовать функцию толстой стрелки для просмотра: 'watch() {() => {console.log (this)}}' –

ответ

14

Вы можете использовать функцию стрелки.

arrow function выражения (также известное как жир функция стрелки) имеет более короткий синтаксис по сравнению с функциональными выражениями и лексический связывает этого значение.

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

это выглядит красивейшим IMO.Спасибо за ответ! –

+3

Как насчет 'removeEventListener' ?! Используйте 'bind (this)'. Подробнее см. Http://stackoverflow.com/questions/30446622/es6-acces-to-this-with-addeventlistener-applied-on-method. – Petr

+0

К сожалению, вам нужно отправить каждый параметр вручную, если вы это сделаете. Ну что ж .. –

1

Ключевое слово class - это просто синтаксический сахар для известной цепи наследования прототипов javascript. Способ работы этого механизма атрибуции одинаков. Просто продолжайте думать о классе как о доброй старой функции, что с этим связано, поэтому его можно отнести к тому, которое использовало ключевое слово new.

E6 содержит множество новых ключевых слов, чтобы сделать объектно-ориентированный javascript более знакомым. Я доволен этим, но все мы должны помнить, что основные части остаются тем же, только теперь с некоторой тенью для новичков: D

Ps: Учитывая, что вы знаете, как this определяются в Javascript, вы можете использовать это без алиаса, например, self или что-то в этом роде, несмотря на то, что это обычная практика.

0

Чистый ES6 способ справиться с этим (на мой взгляд) должен был бы использовать новый Proxy object. Реализация будет выглядеть примерно так:

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

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

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

Я включил бы пример Бабель REPL, однако, здесь является отказ от ответственности: Babel REPL does not support the Proxy object. Таблица совместимости Kangax показывает support in various Javascript engines.

+0

Да, просто попробовал в Вавилоне. Просто ничего не делает. Урх ... был так в восторге от «нового мирового порядка» написания чистого кода. Кажется, мои мечты разбиты. –

+0

Кроме того, если вы попробуете его в Chrome-консоли, он также не работает печально. Полагаю, это не выход. –

Смежные вопросы