在对象字面量中引用嵌套的“兄弟”属性

10
我希望在对象字面量中的一个属性里引用该对象字面量中另一个属性的嵌套属性。 考虑下面这个人为设定的例子:
var obj = {
   product1: {
      price: 80,
      price_was: 100,
      discount: function(){

        return 100 - (100 * (price/price_was));

        //I don't want to use:  
        //100 - (100 * (this.product1.price/this.product1.price_was))
        //because the name of the parent ('product1' in this case) isn't known 
        //a-priori.

      }
   }
} 

上面显然是不正确的,但如何从“discount”内部获取“price”和“price_was”?
我查看了下面的问题,它很接近,但在那个问题中,所需的属性是“this”的直接子级,在上面的示例中并非如此。 object literal中引用变量? 有什么办法可以做到这一点吗?

可能是对象字面量声明中的自引用的重复问题。 - Bergi
1个回答

4
实际上,如果你是从`productN`对象中调用`.discount()`方法,那么这个需要的属性很可能就是`this`的直接子级,即使在上面的例子中这并不是这种情况。
因此,你不应该使用`this.product1.price`,因为如果你是从`productN`调用`discount`方法,那么`this`将引用`productN`,所以只需这样做:
this.price;
this.price_was;

…所以它看起来应该像这样:

var obj = {
   product1: {
      price: 80,
      price_was: 100,
      discount: function(){

        return 100 - (100 * (this.price/this.price_was));

      }
   }
};

假设您是从productN对象中调用该函数。如果不是,请说明如何调用discount将更有帮助。


1
有道理。所以'this'的位置取决于你从对象字面量的哪个位置调用它。好的,我会明天第一时间检查。(我正在设计纸上工作时,这个问题突然出现了)。顺便问一下:你是如何像在你的回答中那样格式化'内联代码'的? - Geert-Jan
1
@Geert-Jan:是的,但实际上有大约六种方法可以设置this,但在形式为obj.method()的情况下,this将被设置为obj。内联格式可以通过在文本周围包装 ` 重音符号来实现。或者只需选择文本,然后单击编辑区域顶部的 { } 代码按钮,它会自动为您包装。 - user113716

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接