2017-01-22 3 views
1

Я определяю объект, где я хочу рассчитать одно из его свойств с другим свойством.Вычислить значение свойства объекта с другим свойством

// first the calculation function 
const calculateArea = (height, width) => { 
    return height * width 
} 

// then the object itself... 
const myObj = { 
    height: 20, 
    width: 10, 
    area: calculateArea(this.height, this.width) 
} 

Я думал, что я мог бы использовать this.height и this.width для доступа к свойствам внутри объекта я был определяющим, но я получаю

Не удается прочитать «Высота» неопределенной

Где я неправильно, и каково решение?

+0

Возможный дубликат [Самостоятельные ссылки в объявлениях литералов объектов] (http://stackoverflow.com/questions/4616202/self-references-in-object-literal-declarations) – Li357

+0

Он должен быть вызван после того, как объект вы не можете ссылаться на свойства объекта, пока он еще не определен. –

+1

'Const myObj = { высота: 20, ширина: 10, площадь: функция() { возврата this.height * this.width } }' – Smiranin

ответ

0

как об этом:

function myObj(height, width) { 
    this.height = height; 
    this.width = width; 
    this.area = calculateArea(height, width); 
} 

let obj = new myObj(20, 10); 
0

Проблема заключается в том, вы пытаетесь ссылаться на ваш объект с это, в то время как он не существует. этот вы можете указать 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() из объекта результата и вернет объект как в форме, которую вы хотели.

Мы только остановили расчет для шага, чтобы наш этот, чтобы указать на правильный контекст, а затем продолжить.

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