2012-07-11 64 views
3

我是JavaScript框架的新手,我非常喜歡Backbonejs的工作方式。 但我有一個關於模型和視圖的構造函數的問題。我已經使用Java語言一樣幾年發展起來的,我用這樣定義構造函數:在Backbone.js的模型和視圖上設置屬性的模式是什麼?

public Car(Manufacturer manufacturer, String model, Color color) { 
    this.manufacturer = manufacturer; 
    this.model = model; 
    this.color = color; 
} 

但我的文檔和其他教程看到,人們通常定義時沒有聲明特定的構造模型或視圖,他們只是構造對象是這樣的:

var car = new Car({manufacturer: ford, model: "Mustang", color: "red"}); 

難道錯或「醜陋」來定義像一個構造函數:

window.Car = Backbone.Model.extend({ 
    initialize: function(manufacturer, model, color) { 
     this.manufacturer = manufacturer; 
     this.model = model; 
     this.color = color; 
    } 
}); 

如果是這樣,你能expla爲什麼? 我真的很希望這不是一個愚蠢的問題,我還沒有找到任何相關的問題。

+1

這不是Java。不要指望它遵循完全相同的語法。 – asawyer 2012-07-11 18:12:01

+1

謝謝您的評論asawyer!其實,我不期待相同的語法,我只是想知道什麼是正確/最好的方法,一旦兩者都有可能。 – 2012-07-11 18:14:31

+0

如果以這種方式定義類,那麼在創建「CarModel」的實例時是否可以訪問'initialize'? – MilkyWayJoe 2012-07-11 18:19:25

回答

5

你傳遞多個參數,而不是一個對象的想法是好的,但是你想初始化函數看起來像這樣:

window.Car = Backbone.Model.extend({ 
    initialize: function(manufacturer, model, color) { 
     this.set({ 
      manufacturer: manufacturer, 
      model: model, 
      color: color 
     }); 
    } 
}); 

您需要使用set訪問屬性對象。通過使用this您將屬性直接附加到模型。

骨幹使用屬性對象的原因是,它可以在您更改屬性時自動觸發事件。這也是方法封裝領域的一種方式,以同樣的方式,你將創建

private Manufacturer manufacturer;

在Java

public Manufacturer getManufacturer()

+1

謝謝Greg Guida!這樣我不覺得我在腐蝕什麼東西。 – 2012-07-11 18:56:59

0

它類似於將上下文對象傳遞給Java中的方法(這是在需要將某些狀態傳遞給無狀態環境中的方法的情況下完成的)。只是碰巧該方法是一個構造函數。我不認爲這有一個特定的官方模式。這是javascript中的一個常見範例。

+0

謝謝你的回答hvgotcodes!但是我發現如果我用'function(man,model,color)'這樣的params來定義initialize作爲構造函數,並且使用** this **變量來定義模型屬性,那麼我不能使用** get **模型的方法,但我可以直接訪問屬性'car.model'。是否有任何影響,例如。在模型屬性上的Backbone事件中,取決於我定義這些屬性的方式? – 2012-07-11 18:30:16

相關問題