Функції зі стрілками не призначені для використання у будь-якій ситуації лише як коротша версія старомодних функцій. Вони не призначені для заміни синтаксису функції за допомогою functionключового слова. Найбільш поширеним варіантом використання функцій стрілок є такі короткі "лямбди", які не перевизначають this, часто використовуються при передачі функції як зворотний виклик деякій функції.
Функції зі стрілками не можуть використовуватися для запису об'єктних методів, оскільки, як ви вже виявили, оскільки функції зі стрілками закриваються над thisконтекстом, що охоплює лексику, thisвнутрішня стрілка є тією, яка була поточною, де ви визначили об'єкт. Що означає:
var chopper = {
owner: 'Zed',
getOwner: () => {
return this.owner;
}
};
У вашому випадку, бажаючи написати метод на об'єкті, вам слід просто використовувати традиційний functionсинтаксис або синтаксис методу, введений в ES6:
var chopper = {
owner: 'Zed',
getOwner: function() {
return this.owner;
}
};
var chopper = {
owner: 'Zed',
getOwner() {
return this.owner;
}
};
(Є невеликі відмінності між ними, але вони тільки важливо , якщо ви використовуєте superв getOwner, яких у вас немає, або якщо скопіювати getOwnerна інший об'єкт.)
У списку розсилки es6 було деяке обговорення щодо повороту на функціях стрілок, які мають подібний синтаксис, але зі своїм власним this. Однак ця пропозиція була сприйнята погано, оскільки це лише синтаксис цукру, що дозволяє людям економити введення декількох символів і не надає нових функціональних можливостей щодо існуючого синтаксису функцій. Див. Розділ функції розв’язаних стрілок .
thisрізному. Це визначається лексичним середовищем, в якому функція була створена, що означає, щоthisзначення, де ви створюєтеchopperзмінну, будеthisзначенням функції. Іншими словами, це не буде посилання наchopperоб’єкт.