2017-01-22 161 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.heightthis.width到我定义对象中访问的属性,但我得到

无法读取的不确定

“高度”我在哪里出错了,有什么解决办法?

+0

[对象字面声明中的自引用]的可能重复(http://stackoverflow.com/questions/4616202/self-references-in-object-literal-declarations) – Li357

+0

它需要在对象被调用后调用创建时,您仍然无法在定义对象属性时引用它。 –

+1

'常量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

的问题是,你正在尝试引用您的对象与这个,虽然不存在了。该这个你可以参考不确定(如你的情况),然后导致错误“未定义无法读取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.widththis.height来计算面积。它也将删除结果对象中的init()函数,返回的对象作为你想要的形式。

我们刚刚暂停计算一个步骤,让我们的这个指向正确的上下文,然后继续。