Проблема заключается в том, вы пытаетесь ссылаться на ваш объект с это, в то время как он не существует. этот вы можете указать undefined (как в вашем случае), что приводит к ошибке «не удается прочитать свойство X неопределенной».
Однако этот может быть связан с другим объектом в контексте в зависимости от ситуации. В этом случае вы не будете принимать эту ошибку и независимо от того, какое значение соответствует связанному объекту, будет возвращено как .
Попытка получить значение из полученного этого объекта может привести к 2 случаям, оба из которых не являются тем, что вы хотите.
- Извлеченный это имеет ширина и свойство высота, так что ваша функция будет получить эти значения и вычислить результат соответственно. Но эти значения не будут теми, которые вы передали в своем объекте.
- Извлеченного этого не обладает свойством ширина или высоты, так что ваша функция получит неопределенной, как его параметры и выдаст ошибку соответствующим образом.
Есть много способов решить эту проблему. Вот мое предложение:
Основная проблема здесь в том, что значение для области рассчитывается с нетерпением, пока вы строите свой объект. Замораживание этого вычисления и запуск его после создания объекта рассчитает правильное значение внутри вашего объекта.
// first the calculation function
const calculateArea = (height, width) => {
return height * width
}
// then the object itself...
const myObj = {
height: 20,
width: 10,
// init, is a function that uses bounded context's width, height
init: function() {
this.area = calculateArea(this.height, this.width);
delete this.init; // We don't want init in our result object
return this;
}
}.init();
Теперь, когда мы называем Init() нашего объекта, у нас будет этот указывает на правильный объект. Он рассчитает площадь с this.width и this.height. Он также удалит функцию init() из объекта результата и вернет объект как в форме, которую вы хотели.
Мы только остановили расчет для шага, чтобы наш этот, чтобы указать на правильный контекст, а затем продолжить.
Возможный дубликат [Самостоятельные ссылки в объявлениях литералов объектов] (http://stackoverflow.com/questions/4616202/self-references-in-object-literal-declarations) – Li357
Он должен быть вызван после того, как объект вы не можете ссылаться на свойства объекта, пока он еще не определен. –
'Const myObj = { высота: 20, ширина: 10, площадь: функция() { возврата this.height * this.width } }' – Smiranin