首页 > 代码库 > javascript面向对象程序设计——封装(by vczero)

javascript面向对象程序设计——封装(by vczero)

在javascript中,我们宣称是面向对象的程序设计。其实面向对象是js与生俱来的特性,每一门OOP语言都有自己的特性,我们不能为了OOP,去模仿另一门语言,把握语言的特性才是正道。我们可以通过new Object()来创建一个实例,但是不推荐这种形式,我们需要更为直观的数据封装。

一、封装你的数据特性

1 var user = {2        name: ‘‘,3        email: ‘‘4 };

很简单,我们封装了一个JSON格式的对象,也称为字面量对象;User对象包含两个属性name和email。我们可以通过user.name和user.email进行赋值和取值。但是,我们发现
没有一个方法可以用。那么进行改造。

二、构建你的方法

1    var user = {2         name: ‘‘,3         email: ‘‘,4         addUser: function(){5            console.log(this.name + ‘已经添加完成‘);6         }7    };

我们发现,我们可以使用user.addUser函数添加一个用户了。但是我们又发现是不是每次我们创建一个对象的时候,都需要重新定义user,user1...usern。这样是不是没有了重用性和十分不优雅。js是面向对象的语言,我们继续改造。

三、能够构造更多的实例

1     var User = function(name, email){2          this.name = name;3          this.email = email;4          this.addUser = function(){5               console.log(this.name + ‘已经添加完成‘);6          };7     };

js是函数式编程,因此function既可以是普通的函数,又可以是作为构造函数使用。如果使用了new User(),那么就是采用了构造函数的形式和特性;如果没有使用new,则是使用了全局变量window上的一个函数而已。同时,我们可以看出,var User的User进行了大写,这是采用了标准的类命名规则,建议首字母大写。User就是一个基本类,包含name和email两个属性,addUser一个方法。我们可以构建一些实例。

1     var user = new User(‘vczero‘, ‘wlh_js@126.com‘);2     user.addUser();

上面的类基本具有了类的基本特征了。这时,新的要求提出来了,我们能否将属性和函数都不要写在构造函数里面,太过臃肿了。其实,将addUser函数写出来时有道理的。比如:

1    var user1 = new User(‘vczero‘, ‘wlh_js@126.com‘);2    user1.addUser();3    var user2 = new User(‘vczero‘, ‘wlh_js@126.com‘);4    user2.addUser();5    console.log(user1.addUser === user2.addUser);//false

我们发现结果却是false。原因很简单,因为每一个实例都会在堆内存中创建一块存储区域,每个实例具有每个实例的特性,这两块区域是相互独立的。this指向的是本类的实例。

四、使用原型prototype
那样的话,不仅代码不优雅同时太浪费存储空间了。为了避免这种情况,我们不得不重新思考,有没有办法让addUser方法共享,每个实例拿着引用去调用就行。在js中,每个函数都有一个prototype(原型)属性,这个属性代表一个指针,指向的是一个对象。一般在prototype中,存放的都是共享的方法和属性。因此,我们继续改造。

1     var User = function(name, email){2          this.name = name;3          this.email = email;4     };5 6     User.prototype.addUser = function(){7           console.log(this.name + ‘已经添加完成‘);8     };

这样,所有的实例化的对象都引用的是同一个addUser。我们又开始思考,我们需要查询一个数据库的数据,这个时候,我们不需要在构造一个对象后然后去查询。但是,我们有需要在User命名空间下,代表是User的相关操作,这时。我们可以使用类的方法,也就是“静态方法”。

五、“静态方法” 或者 “类方法”
“静态方法”我打了个引号,习惯了强类型语言都习惯这种说法,比如:JAVA & C++。但是,因为js中能够随时给一个变量添加属性,那么我更愿意说是“类的方法”。

 1     var User = function(name, email){ 2          this.name = name; 3          this.email = email; 4     }; 5  6     User.prototype.addUser = function(){ 7           console.log(this.name + ‘已经添加完成‘); 8      }; 9 10      User.findUser = function(user){11          console.log(‘查询到了用户‘ + user.name);12     };13 14      User.deleteUser = function(user){15           console.log(‘删除了用户‘ + user.name);16      };