(二)javascript的封装(闭包)

封装和信息隐藏直接的关系应该算是同一个意思不同的表述方式吧,在java中使用private来实现一个变量某一个method只能在内部使用,在javasciprt中并没有该关键字,只能使用另一个概念,闭包来实现,说闭包之前先说一下javascript的三种创建对象的方式。
如有一下java代码:
public class User{
private String id;
private String name;
//get set 
}
创建一个User对象
User u = new User("1","小明");

使用javascript创建一个User对象第一种方式,名其名曰门户大开型,最简单,最直接的一种方式,只提供公共的变量
var User = function(id,name){
 this.id=id;
 this.name=name;
}
//创建一个User对象
var User = new User('1','小明');

第二种方式,命名规范区别私有成员,即提供get set 私有变量通过_开头
var User = function(id,name){
	this.setId(id);
	this.setName(name);
}
User.prototype={
	setId : function(id){
		this._id=id
	},
	getId : function{
		return this._id;
	},
	getName : function(){
		return this._name;
	},
	setName:function(name){
		this._name=name;
	}
}
//创建一个User对象
var User = new User('1','小明');

以上两种方式其实差不多的,都存在一个问题就是可以直接通过对象点属性的方式改变属性的值,其实并没有完成私有化变量
下面讲解第三中方式通过闭包的方式
var User = function(id,name){
	//直接声明两个变量,这两个变量的作用域只是在这个函数体之中所以外界是不能访问的
	var _id,_name;
	this.setId = function(id){
		_id=id
	},
	this.getId = function(){
		return _id;
	},
	this.getName = function(){
		return _name;
	},
	this.setName=function(name){
		_name=name;
	}
	this.setId(id);
	this.setName(name);
}

发现没有?这种方式外界就无法直接通过对象点属性的方式修改了
静态函数的创建,其实也和闭包相关的只需要将第三种方式进行改写
var User = (function(id,name){
		
		//此处的方法只会存在一个,无论你创建多少个User 
                //private方法 外界无法访问
		function show(){
			//...
		}


	return function(id,name){
		//私有属性
		var _id,_name;
	this.setId = function(id){
		_id=id
	},
	this.getId = function(){
		return _id;
	},
	this.getName = function(){
		return _name;
	},
	this.setName=function(name){
		_name=name;
	}
	this.setId(id);
	this.setName(name);
	}
})();

你可能感兴趣的:(JavaScript,闭包,封装)