В ES6 оба они допустимы:
var chopper = {
owner: 'Zed',
getOwner: function() { return this.owner; }
};
и, как сокращение:
var chopper = {
owner: 'Zed',
getOwner() { return this.owner; }
}
Можно ли также использовать новые стрелочные функции? Пытаясь что-то вроде
var chopper = {
owner: 'John',
getOwner: () => { return this.owner; }
};
или
var chopper = {
owner: 'John',
getOwner: () => (this.owner)
};
Я получаю сообщение об ошибке, предполагающее, что у метода нет доступа к this
. Это просто проблема синтаксиса, или вы не можете использовать методы толстой трубы внутри объектов ES6?
this
другому. Он определяется лексической средой, в которой была создана функция, что означает, чтоthis
значение, в котором вы создаетеchopper
переменную, будетthis
значением функции. Другими словами, он не будет ссылаться наchopper
объект.this
значение, сначала создавchopper
объект, а затем выполняя присвоение в функции,this
указывающей на этот объект. Это можно сделать довольно чисто с помощью функции-конструктора.console.log()
результат вызова метода. Оно работает.Ответы:
Стрелочные функции не предназначены для использования в каждой ситуации просто как сокращенная версия устаревших функций. Они не предназначены для замены синтаксиса функции с использованием
function
ключевого слова. Наиболее распространенный вариант использования стрелочных функций - это короткие «лямбды», которые не переопределяютсяthis
, часто используемые при передаче функции в качестве обратного вызова какой-либо функции.Стрелочные функции нельзя использовать для написания методов объекта, потому что, как вы обнаружили, поскольку стрелочные функции закрывают
this
лексически охватывающий контекст,this
внутри стрелки является тот, который был текущим в том месте, где вы определили объект. То есть:// Whatever `this` is here... var chopper = { owner: 'Zed', getOwner: () => { return this.owner; // ...is what `this` is here. } };
В вашем случае, желая написать метод для объекта, вы должны просто использовать традиционный
function
синтаксис или синтаксис метода, представленный в ES6:var chopper = { owner: 'Zed', getOwner: function() { return this.owner; } }; // or var chopper = { owner: 'Zed', getOwner() { return this.owner; } };
(Между ними есть небольшие различия, но они важны только в том случае, если вы используете
super
ingetOwner
, чего нет, или если вы копируетеgetOwner
в другой объект.)В списке рассылки es6 велись споры об изменении стрелочных функций, которые имеют похожий синтаксис, но со своим собственным
this
. Однако это предложение было плохо воспринято, потому что это просто синтаксический сахар, позволяющий сэкономить при вводе нескольких символов и не предоставляющий новых функциональных возможностей по сравнению с существующим синтаксисом функций. См. Тему несвязанные стрелочные функции .источник
В этой строке
getOwner: => (this.owner)
должно быть:var chopper = { owner: 'John', getOwner: () => this.owner }; //here `this` refers to `window` object.
Вам нужно будет объявить
this
функцию:var chopper = { owner: 'John', getOwner() { return this.owner } };
Или:
var chopperFn = function(){ this.setOwner = (name) => this.owner = name; Object.assign(this,{ owner: 'Jhon', getOwner: () => this.owner, }) } var chopper = new chopperFn(); console.log(chopper.getOwner()); chopper.setOwner('Spiderman'); console.log(chopper.getOwner());
источник
"TypeError: Cannot read property 'owner' of undefined\n at Object.chopper.getOwner
this
внутри функции.this
не обязательно относится кwindow
. Он относится к тому, что текущее значениеthis
находится в окружающей среде, которая может быть или не бытьwindow
. Может ты это имел в виду. Просто хочу убедиться, что он понимает, что это не какое-то значение по умолчанию.this
теперь относится к классуvar chopperFn = function() { this.owner = 'Jhon'; this.getOwner = () => this.owner; }
.Небольшой совет, которому я следую, чтобы использовать функции стрелок.
object.method()
синтаксис. (Это функции, которые получат значимоеthis
значение от вызывающего.)источник
Эта внутренняя стрелочная функция не отражает контекст объекта. Вместо этого он дает контекст, в котором вызывается метод объекта.
Отметьте это, это дает некоторое представление о том, когда использовать стрелку, а когда нет. https://dmitripavlutin.com/when-not-to-use-arrow-functions-in-javascript/
источник
Если вам нужно использовать функцию стрелки, вы можете изменить
this
наchopper
,var chopper = { owner: "John", getOwner: () => chopper.owner };
Хотя это не лучшая практика, при изменении имени объекта необходимо изменить эту стрелочную функцию.
источник
Другой совет, в строгом режиме, по-
this
прежнему относится к Window, а не к undefined.(() => { "use strict"; console.log(this); // window })(); (function () { "use strict"; console.log(this); // undefined })();
источник