2013-05-08 84 views
2

我有一個模型的構造函數(類似於Backbone模型),它使用傳遞給模型工廠的商店實例(例如MongoDB/Redis)。現在的構造函數模型裏面,我做JavaScript中的原型/類/公共屬性

this.store = options.store; 

店現已作爲this.store一次我構建一個實例與var model = new Model()

然後我遇到了一種情況,當我的模型有「公共」方法時,例如, Model.find()這將在沒有實例化模型的情況下工作。但是現在因爲它沒有被實例化,Model內部的函數無法通過this.store訪問存儲。

我所做的是,我開始還將修補問題的構造函數本身Model.store = options.store添加到商店。但是現在商店暴露給任何使用Model構造函數的東西,這是不可取的。

我在猜測我做錯了什麼。所以我會很感激一些幫助。

+2

您正在將_instance_ methods/properties與類方法/屬性混淆。 「公共」意味着知名度,而不是所有權。 – 2013-05-08 17:01:55

+0

@MattBall我明白,但問題仍然存在,這是做到這一點,還是我完全錯了? – 2013-05-08 17:48:56

+0

你沒有顯示太多的代碼,所以我不能說真的。但它似乎有一個更好的方法。 – 2013-05-08 18:04:15

回答

1

如果我得到你說的正確,那麼我想你想要的是允許在模型上的「靜態」find()方法,而不暴露store變量。 Javascript實際上並沒有正式的私有空間,但你可以使用閉包獲得你想要的東西。這裏有一個小提琴:

http://jsfiddle.net/52FPy/

編輯: 更新的小提琴表現出不同的方式使用閉揭露/隱藏信息: http://jsfiddle.net/52FPy/2/

簡述:

var Model = function(){ 
    var store = 'this is a store'; 
    var Model = function(){ 

    } 

    Model.find = function(){ 
     return store; 
    } 

    return Model; 
}() 

這將「隱藏「store變量以你想要的方式。