javascript的闭包
封装和信息隐藏直接的关系应该算是同一个意思不同的表述方式吧,在java中使用private来实现一个变量某一个method只能在 内部使用,在javasciprt中并没有该关键字,只能使用另一个概念,闭包来实现,说闭包之前先说一下javascript的三种创建对象的方式。
如有一下java代码:
1. public class User{
2. private String id;
3. private String name;
4. //get set
5. }
6. 创建一个User对象
7. User u = new User("1","小明");
使用javascript创建一个User对象第一种方式,名其名曰门户大开型,最简单,最直接的一种方式,只提供公共的变量
1. var User = function(id,name){
2. this.id=id;
3. this.name=name;
4. }
5. //创建一个User对象
6. var User = new User('1','小明');
第二种方式,命名规范区别私有成员,即提供get set 私有变量通过_开头
1. var User = function(id,name){
2. this.setId(id);
3. this.setName(name);
4. }
5. User.prototype={
6. setId : function(id){
7. this._id=id
8. },
9. getId : function{
10. return this._id;
11. },
12. getName : function(){
13. return this._name;
14. },
15. setName:function(name){
16. this._name=name;
17. }
18. }
19. //创建一个User对象
20. var User = new User('1','小明');
以上两种方式其实差不多的,都存在一个问题就是可以直接通过对象点属性的方式改变属性的值,其实并没有完成私有化变量
下面讲解第三中方式通过闭包的方式
1. var User = function(id,name){
2. //直接声明两个变量,这两个变量的作用域只是在这个函数体之中所以外界是不能访问的
3. var _id,_name;
4. this.setId = function(id){
5. _id=id
6. },
7. this.getId = function(){
8. return _id;
9. },
10. this.getName = function(){
11. return _name;
12. },
13. this.setName=function(name){
14. _name=name;
15. }
16. this.setId(id);
17. this.setName(name);
18. }
发现没有?这种方式外界就无法直接通过对象点属性的方式修改了
静态函数的创建,其实也和闭包相关的只需要将第三种方式进行改写
1. var User = (function(id,name){
2.
3. //此处的方法只会存在一个,无论你创建多少个User
4. //private方法 外界无法访问
5. function show(){
6. //...
7. }
8.
9.
10. return function(id,name){
11. //私有属性
12. var _id,_name;
13. this.setId = function(id){
14. _id=id
15. },
16. this.getId = function(){
17. return _id;
18. },
19. this.getName = function(){
20. return _name;
21. },
22. this.setName=function(name){
23. _name=name;
24. }
25. this.setId(id);
26. this.setName(name);
27. }
28. })();