一 创建“类中”的私有变量
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;
}();