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 = {};

有关类图案进一步阅读: