黑铁时代
Programing is not only one kind of technology, but also one kind of art.

一 创建“类中”的私有变量

function Obj() {
  var _varible = 1;

  function increase() {
    ++ _varible;
  }

  function getVarible() {
    return _varible;
  }

  this.method = function() {
    increase();
    alert( getVarible() );
  }
}

var obj1 = new Obj();
obj1.method();

var obj2 = new Obj();
obj2.method();

因为_varible,increase,getVarible都是Obj的函数的变量对象,所以method对其有访问的能力。因此,在创建了obj1之后,obj1的method方法依然可以访问到它们,这就依然体现出了闭包的特性。而且method方法是唯一的访问它们的方式,因为对于局部变量,外部是不能直接访问的,所以就类似访问类中的私有变量,只有对象的成员方法可以访问。不过缺点就是构造函数中定义的方法,会在每次实例一个对象都会被创建。

 

二 静态私有变量

( function() {
  var staticVar = 10;

  function increase() {
    ++ staticVar;
  }

  function getVarible() {
    return staticVar;
  }

  Obj = function( name ) {
    this.name = name;
  }

  Obj.prototype.method = function() {
    increase();
    alert( getVarible() + ' ' + this.name );
  }
} )();

var obj3 = new Obj( 'Leo' );
obj3.method(); // 11 Leo

var obj4 = new Obj( 'Leo' );
obj4.method(); // 12 Leo

这个时候的static,increase,getVarible都可以看成是Obj的静态变量对象,被所有的对象实例共享。

 

三 单例模式

  var ElementManager = function() {

    var elements = [];

 

    return {

      addElement: function( element ) {

        elements.push( element );

      },

      removeElement: function( element ) {

        for ( var i = elements.length; i >= 0 ; i-- ) {

          if ( elements[ i ] === element ) {

            elements.splice( i, 1 );

            break;

          }

        } 

      },

      getElements: function() {

        return elements;

      }

    }

  }();

// 返回一个对象赋值给ElementManager,对象中提供了多个共有方法,外部可以通过ElementManager对象进行调用,而这些方法都可以访问变量elements。

 

四 外观模式

  ( function( win ) {

    var somvar = .....

    Code...

    win.mylib = mylib;

  } )( window );

外观模式提供了一个统一的接口mylib给外部使用,几乎所有的js库都会使用这种模式。试想一下如果你要使用多个库,如果它们都直接向全局环境输出变量和方法,会变得多么可怕,而且很容易产生名称冲突。

 

五 增强的单例模式

var singleton = function() {

  var _privateVar = 1;

  function privateFun() {

  }

 

  var app = {};

  app.fun = function() {

  }

  app.version = '1.0.0';

 

  return app;

}();

posted on 2012-07-05 22:41  黑铁时代  阅读(496)  评论(0编辑  收藏  举报