2015-04-07 179 views
0

我想访问对象字面图中的父对象,我不确定正确的方法来完成此操作。这是一些伪代码。嵌套对象字面访问父

function MealPlan() { 
    this.sets = [] 
} 

MealPlan.prototype = { 
    protein: { 
    getTotalSets: function() { 
     return this.sets.length; 
    } 
    } 
}; 

我想从getTotalSets函数中获取持有的sets属性。

+1

也许你忘了给函数添加一个'return'语句......但就是这样。 :) –

+0

对不起,这不仅仅是一个快速庞克我扔在一起:) – Marco

+2

@BrunoToffolo - '这''采取'MealPlan.prototype.protein'的上下文 - 这不是OP想要的上下文。 – Adam

回答

1

这实际上不能做(不使用callapply的方式@RichardMacarthy表明黑客),因为你正在创建通过创建原型的新对象上下文(例如protein)新的上下文。 prototype用于将方法添加到对象,而不是属性。

或者,您可以将您的property设置为method,这将允许您保留对象的原始上下文。

function MealPlan() { 
    this.sets = [] 
} 

MealPlan.prototype = { 
    protein: function() { 
    var self = this; 
    return { 
     getTotalSets: function() { return self.sets.length; }, 
     anotherMethod: function() { /* ... */ }, 
    } 
    } 
}; 

var mp = new MealPlan(); 
mp.protein().getTotalSets(); 
+0

啊好吧我只是想将相关的方法组合在一起,因为会有一组蛋白质,碳水化合物,脂肪 – Marco

+0

谢谢你,我会走这条路。 – Marco

+0

这是一个很好的答案,如果你想坚持使用原型(它的内存效率稍高一点),那么这是一个很好的选择。我还在下面添加了一个新的答案,说明如何实现它,以便'mp.protein.getTotalSets()'仍然可以工作(另外,考虑使用特征)。 –

0

根据你从哪里调用函数,你可以这样做:使用call在你的函数中设置this的上下文。

function MealPlan() { 
    this.sets = [] 
} 

MealPlan.prototype = { 
    protein: { 
    getTotalSets: function() { 
     console.log(this) 
     this.sets.length; 
    } 
    } 
}; 

var m = new MealPlan(); 

console.log(m.protein.getTotalSets.call(m)); 
+0

嗯这就是我不想暴露的API流。有没有其他方法可以构建图表来避免这种情况? – Marco

0

有几种不同的方式,你可以去这个......这里是可能已经最接近你的原意一个办法:

function MealPlan() { 
    var self = this; 
    self.sets = []; 

    self.protein = { 
     getTotalSets: function() { return self.sets.length; }, 
     anotherMethod: function() { /* ... */ }, 
    } 
} 

var mp = new MealPlan(); 
mp.protein.getTotalSets(); 

你可以替换地实现protein为特征;看看http://soft.vub.ac.be/~tvcutsem/traitsjs/