如何在面向对象的方法中将类似的方法和变量组合在一起?

时间:2011-11-15 00:55:46

标签: javascript

我正在寻找标准方法来做到这一点.. 这篇文章here探讨了3种方法。 Here来。您应该以哪种方式用于通用案例......这是一个偏好问题 例如,如果我使用实例化方式..我有两行代码而不是一行...我必须实例化对象...而不是调用方法... 如果我使用静态类型实现而不是实例化任何对象。 模块模式的第3个选项...更昂贵b.c.它是自动执行的。

如果我必须给他们起名字:

  1. object - 非静态
  2. object - static
  3. 模块模式
  4. 一般情况下建议使用哪种方式,因此每次开始合并方法时我都不必讨论这个问题。

    以下是我想要整合的收集方法的示例。

    /********************
    group:checks
    ********************/
    
    var patterns = 
      {
      name: /^[a-zA-Z-\s]{1,20}$/,
      email: /^[a-zA-Z0-9._(-)]+@[a-zA-Z0-9.(-)]+\.[a-zA-Z]{1,4}$/,
      pass: /.{6,40}/,
      url:  /^[(-)\w&:\/\.=\?,#+]{1,}$/,
      aml:  /<(.+)_([a-z]){1}>$/
      };
    
    /*
    - check_generic() - generic 
    */
    
    function check_generic(reg_ex_in,text,html_id,response)
      {
      if(!reg_ex_in.exec(text.value))
        {
        fill_id(html_id,response);
        return 0;
        }
      return 1;
      }
    
    /*
    - check_empty() - checks for empty text 
    */
    
    function check_empty(text,html_id,response) 
      {
      for(var a=0;a<text.length;a++)
        {
        if(text[a].value==='')
          {
          fill_id(html_id,response);
          return 0;
          }
        }
      return 1;
      }
    
    /*
    - check_same() - checks if two text entries are the same 
    */
    
    function check_same(text1,text2,html_id,response)
      {
      if((text1.value)!==(text2.value))
        {
        fill_id(html_id,response);return 0;
        }
      fill_id(html_id,'');
      return 1;
      }
    

1 个答案:

答案 0 :(得分:4)

以下是我通常遵循的规则:

如果我将一组无状态静态函数组合在一起(实质上是命名它们),我会将它们粘贴在一个对象中:

var MyNamespace = {
   patterns: {
      name: /^[a-zA-Z-\s]{1,20}$/,
      email: /^[a-zA-Z0-9._(-)]+@[a-zA-Z0-9.(-)]+\.[a-zA-Z]{1,4}$/,
      pass: /.{6,40}/,
      url:  /^[(-)\w&:\/\.=\?,#+]{1,}$/,
      aml:  /<(.+)_([a-z]){1}>$/
   },

   check_generic: function(reg_ex_in,text,html_id,response)
   {
      if(!reg_ex_in.exec(text.value))
      {
        fill_id(html_id,response);
        return 0;
      }
      return 1;
   }
};

如果我希望有一个有状态的类实现而不关心访问控制,我将使用实例化方法:

var MyClass = function(param) {
    // initialize here
};
MyClass.prototype = {
   // method definitions here
};

如果我正在做一些需要访问控制的更复杂的事情,我将使用模块模式:

var mod = (function() {
    var o = {};
    var _p = "myprivatestring";
    o.p = "mypublicstring";

    o.myfunc = function() {
        this.p = _p;
    };

    return o;
})();

console.log(mod.p);
mod.myfunc();
console.log(mod.p);

http://jsfiddle.net/dbrecht/WLN6Y/