2011-10-26 27 views
1

我想在JavaScript和Canvas中做一個框架(學術)動畫,我開始尋找使用javascript實現面向對象編程的指南,並且發現太多變體。在javascript中實現OOP的更好方法

例子:

// Example 1 
var object = { 
    public_method: function(){ //do something } 
} 

// Example 2 
function object(){ 
    this.public_method = function(){ //do something } 
} 
var o = new object(); 

這是正確的或最佳方式(簡單,光)這樣做。

注:這種項目的良好設計模式?

+0

兩者都不;第一種形式不使用JavaScript的原型繼承,第二種形式爲每個對象實例創建一個新的閉包。 – Phrogz

+0

我強烈建議你閱讀[this]上的接受答案(http://stackoverflow.com/questions/1595611/how-to-properly-create-a-custom-object-in-javascript)SO問題。 – ZenMaster

回答

4

第一個將只創建一個單一實例,而第二個可用於創建多個實例。

我更喜歡使用構造函數並將方法放在原型中。這樣,所有實例的創建方法一次,而不是爲每個實例單獨創建:

function ExampleObject() { 
    this.answer = 42; 
} 

ExampleObject.prototype = { 
    get_answer: function(){ return this.answer; }, 
    another_method: function(){} 
}; 

var obj = new ExampleObject(); 
alert(obj.get_answer()); 
+1

建議您澄清原型中設置函數與爲「構造函數」中的每個對象實例創建閉包之間的區別。同樣強烈建議你在你的例子中使用'Object'以外的東西。 – Phrogz

+0

@ Phrogz:好點。 – Guffa

+0

@Guffa我還建議您至少提及您的方法附帶的全球名稱空間/變量污染危險。 – ZenMaster

3

如果你想要的東西,這將是類似於經典的面向對象的設計(其中圍繞),你應該做的這樣的事情:

function MyClass(param1, param2) { 
    this.param1 = param1; 
    this.param2 = param2; // These are fields. 
} 
MyClass.prototype.publicMethod = function() { 
    // do something 
} 
var o = new MyClass(x, y); 

我建議你閱讀更多關於prototype。這使您可以創建同一個「類」的多個實例,而不會浪費存儲器,執行和編程來分別定義每個實例的方法。