2011-03-22 40 views
7

在Javascript中創建類(如在OOP中)的最佳方式是什麼? 現在我正在使用以下模式。可以嗎?創建javascript類時使用什麼樣的模式?

var myclass = (function() { 
var _name; 
var baseObject = { 
    a: 10, 
    c: function() { 
     return _name + " world " + privateFunc(); 
     } 
}; 
function privateFunc() { return _name + "-ba"; }; 

function myclass(name) { 
    _name = name; 
    this.x = 9; 
}; 
myclass.prototype = baseObject; 
return myclass; })(); 
+0

這看起來頗爲相似方式的CoffeeScript編譯的類輸出看起來像 – david 2011-03-22 08:45:42

回答

2

沒有「最好的辦法。 JavaScript中有一些OOP模式,你提到的是其中的一種(也是一種流行的模式)。它本質上是一個典型的(或僞古典)模式,用封閉來封裝基於私有類的靜態變量。

還有其他模式(例如Douglas Crockford推薦的功能模式)。

我個人推薦僞古典模式(儘管哪種模式最好是辯論的熱點領域)。

如果你是用JavaScript實現面向對象編程,我強烈建議您考慮採用一個JavaScript庫,具有OOP內置的,如The Dojo ToolkitClosure Library。其他庫(例如jQuery,MOOtools,Ext等)都有OOP模塊和/或插件。

+0

感謝您提出我目前的模式。目前,我正在將代碼添加到使用jQuery的現有軟件中。我想知道Dojo或Closure庫是否適用於jQuery ... – user670800 2011-03-22 09:10:06

+0

Dojo或Closure既可以與jQuery一起工作,也可以不需要,因爲jQuery將複製它們的大部分功能。你最好堅持使用jQuery和OOP插件。我知道John Resig正在研究將正式的類系統構建到jQuery中。 – 2011-03-22 09:39:15

2

Javascript使用原型繼承。

如果你想創建自定義類,我會建議讀了什麼是典型的遺傳有關,而不是試圖迫使C#方法到JS(實現了典型的基於類的繼承)

http://phrogz.net/js/classes/OOPinJS.html

+0

你永遠不會實現在JS基礎類繼承。你只能讓它看起來基於課堂。但最終,超級方法和屬性將始終在原型鏈中查找。 – 2011-03-31 16:49:49

8

在我看來,在JavaScript中創建類的最好方法是「不要」。請原諒我的直言不諱,但是在使用JavaScript時,請儘量忘掉類 - 它們在這裏不存在 - 並且接受該語言只處理對象。

沒有語言中的類,意味着要編寫的代碼更少。在典型的應用中,大多數物體沒有任何兄弟姐妹。您將只擁有一個document,一個window,一個userList等使用對象的文字符號創建這些對象:雖然有在JavaScript中沒有類

var userList = { 
    users: [] 
}; 

,有構造原型。當您有幾個相似的對象時(例如,包含在userlist中的用戶),這些概念會派上用場。您的代碼示例使用了這兩個概念。使用像myclass這樣的名字,很難說出你想要建模的東西。這裏有一個User構造的例子,一個推廣到它的原型:

var User = function (name) { 
    this.name = name; 
}; 

User.prototype.sayHello = function() { 
    return "Hello, my name is " + this.name; 
}; 
+1

我建議你添加「在我看來」,因爲與JavaScript的OOP的優點/缺點仍然激烈辯論。很多人會不同意你說OOP是最好的。 – 2011-03-22 08:39:01

+0

@Stephen:你可能是對的。前面添加了恕我直言免責聲明:) – 2011-03-22 08:42:47

+8

我不明白(來自C++)是爲什麼有這麼多的關於JS是否有類的麻煩。你的答案,即使你聲稱不是創建類。與實現細節無關 - 從邏輯上講,您定義了一種特定類型的對象,並具有函數,屬性和多個實例(以及繼承)的功能。 – Jono 2013-02-20 05:27:09

7

下面的例子說明,我個人隨着時間的推移開發的模式。

它利用範圍允許私人領域和方法。

詳細討論,請看看JavaScript class patterns

Employee = (function(){ 

    // private static field 
    var staticVar; 

    // class function a.k.a. constructor 
    function cls() 
    { 
    // private instance field 
    var name = ""; 
    var self = this; 

    // public instance field 
    this.age = 10; 

    // private instance method 
    function increment() 
    { 
     // must use self instead of this 
     self.age ++; 
    } 

    // public instance method 
    this.getName = function(){ 
     return cls.capitalize(name); 
    }; 

    this.setName = function(name2){ 
     name = name2; 
    }; 

    this.increment = function(){ 
     increment(); 
    }; 

    this.getAge = function(){ 
     return this.age; 
    }; 
    } 

    // public static field 
    cls.staticVar = 0; 

    // public static method 
    cls.capitalize = function(name){ 
     return name.substring(0, 1).toUpperCase() + 
      name.substring(1).toLowerCase(); 
    }; 

    // private static method 
    function createWithName(name) 
    { 
    var obj = new cls(); 
    obj.setName(cls.capitalize(name)); 
    return obj; 
    } 

    return cls; 
})(); 

john = new Employee(); 
john.setName("john"); 

mary = new Employee(); 
mary.setName("mary"); 
mary.increment(); 

alert("John's name: " + john.getName() + ", age==10: "+john.getAge()); 
alert("Mary's name: " + mary.getName() + ", age==11: "+mary.getAge()); 
相關問題