0

我在尋找一個相對簡單而有效的機制來實施清潔尋找:有誰知道一個健壯的JavaScript僞類?

  • 公共,私有和保護成員(實際公共/私營/保護訪問,但仍然可擴展)
  • 繼承(單或多個)
  • 構造函數重載(不喜歡都數不過來指定參數和檢查類型的一組複雜的嵌套條件的)
+1

@Xymostech - 你可以在閉包中使用局部變量實現等價於「private」的功能。 – nnnnnn 2013-02-17 02:59:23

+0

@nnnnnn公平點。儘管如此,「受保護」仍然沒有出現。 – Xymostech 2013-02-17 03:00:53

+0

而javascript確實具有簡單的繼承性,在一天中可以調用重載,以及使變量無法訪問的方式。這聽起來像OP一樣在尋找某種類,就像你在許多C語言中使用的那樣,它會在javascript中修復所有這些,而afaik不存在。 – adeneo 2013-02-17 03:15:32

回答

1

好吧...自己做一杯咖啡,寫這篇之前。唯一我無法幫助你的是超載。不過沒關係,在這裏我們去:

// Class pattern with 
// - dynamic prototypes 
// - public, private, static, static private members 
// Keeps functions named the way you want it to. 
// Working example: 
var YourClass = (function(){ 

    var Pseudo = function(){ 
     var args = arguments; 

     // constuct the instance in here: 
     var YourClass = function(){ 
      var public = this, 
       private = {}; 

      public.foo = args[0] ? args[0] : "bar"; 
      public.staticPrivateInt = ++static_private.someInt; 

      private.fibo = "nacci"; 

      // fibo is private - return it's value 
      // with a getter to make it "protected" 
      public.getFibo = function(){ 
       return private.fibo; 
      } 

      public.setFibo = function(value){ 
       if(typeof value === "string"){ 
        // handle optional events here 
        return private.fibo = value; 
       }else{ 
        return false; 
       } 
      } 
     }; 


     var static = Pseudo, 
       static_private = {}; 

     // statics: 
     static_private.someInt = 100; 
     static.increaseSomeInt = function(){ 
      ++static_private.someInt; 
     } 


     // extend on creation of an instance: 
     YourClass.prototype = args[0] || new Object(); // or anything else, just an example 

     return new YourClass; 
    }; 
    return Pseudo; 

}()); 

用法:

var myInstance = new YourClass({ 
    someCfg: true 
}); 

console.log(myInstance.someCfg === true); // will log true 

多虧JavaScript的詞法作用域和閉包一個,的確可以模擬類被設計在如C等語言的方式++, Java等。

使用該模式時請記住以下幾點:

  1. 在嚴格模式下,變量名稱如靜態,私有或公開將導致錯誤 。如果需要,您可以重命名它們。
  2. 靜態私有變量不應該被存儲爲static.private,因爲它們不再是私有的(因此變量爲static_private)。

它是如何工作

基本上,你想要的是:

  1. public成員與<object>.<member>訪問。在Javascript中,通常使用this.<member> = <assignment>;

    =>對於convenienve,創建一個簡單的別名: var public = this;

  2. private成員能夠在構造函數中可見的,但不是在該實例。仍然需要訪問public方法。

    =>var private = {}; 您可以創建簡單變量,例如var fibo="nacci";,但我發現private.fibo="nacci";更具可讀性。任何使用var關鍵字創建的變量都不能從構造函數的外部範圍訪問。

  3. static即使尚未創建該類的實例,也要準備好成員。在JavaScript中這樣做的常用方法是給構造函數本身分配一個值或函數。看到如此質疑here

    =>此外,爲便於閱讀: var static = Pseudo;

  4. static private成員:Occasionaly,你可能希望有靜態成員是你的構造外面看不見。

    =>使用詞法作用域來存儲它們。 var static_private = {};

有關類圖案進一步閱讀: