Деструктуризация - это просто синтаксис c сахар для присвоения свойств объекта переменным, поэтому следующая строка:
let {radius, getArea, getCircumference} = circle;
эквивалентна:
let radius = circle.radius;
let getArea = circle.getArea;
let getCircumference = circle.getCircumference;
Здесь getArea
- просто ссылка на базовую функцию, которая не включает контекст circle
. Так что ваша переменная getArea
может быть объявлена так:
const getArea = function() {
return Math.PI * this.radius * this.radius;
}
console.log(getArea()); // NaN
Таким образом, this
в функции определяется контекстом вызова getArea
, когда на самом деле вызывается . Поскольку в приведенном выше примере контекст не предоставляется, по умолчанию используется глобальный объект window
.
Вы можете указать this
функции getArea()
позже, используя .call()
:
const circle = {
radius: 10,
color: 'orange',
getArea: function() {
return Math.PI * this.radius * this.radius;
},
getCircumference: function() {
return 2 * Math.PI * this.radius;
}
};
let {radius, getArea, getCircumference} = circle;
console.log(getArea.call(circle)); // 314.1592653589793