封装和信息隐藏直接的关系应该算是同一个意思不同的表述方式吧,在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);
}
})();