2015-04-07 208 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/