这个系列主要探讨的是javascript面向对象的编程,前面已经着重介绍了一下js的继承,下面想简单的说一下js如何实现封装的特性。
我们知道面向对象的语言实现封装是把成员变量和方法用一个类包围起来,对类中变量的访问只能通过已定义的接口。封装可以算是一种信息隐藏技术,java通过private修饰符将成员变量私有化,并提供对外修改的接口,以控制类中的成员变量的访问和修改。当然在这些方法中可以对数据进行一些加工。
在前面文章已经介绍了js的属性问题,那么在js中如何实现对类的属性隐藏呢?这里封装有会有什么蔽端。
下面看一下实现封装的代码:
var Person = (function(){ //定义私有方法,相当于private方法,只能在内部访问 function hello(){ alert(‘hello world!‘); } return function(){ //定义私有属性,相当于private属性,只能在公有方法内部访问 var name,age; //定义公有方法,相当于public方法,可以在类的实例中方法 this.getName = function(){ return name; }; this.setName = function(newName){ name = newName; }; this.getAge = function(){ return age; } this.setAge = function(newAge){ age = newAge; }; this.say = hello; this.introduce = function(){ alert(‘my name is :‘+this.getName()); } } })() var p = new Person(); p.say(); //hello world p.setName(‘xiaoming‘); p.introduce(); //my name is : xiaoming
封装的好处这儿就不用多说了,但在js里使用一定得注意,避免过度封装。下面看一下封装对继承有没有什么影响。
代码如下:
var Person = (function(){ //定义私有方法 function hello(){ alert(‘hello world!‘); } return function(){ //定义私有属性,相当于private属性 var name,age; //定义公有方法,相当于public方法 this.getName = function(){ return name; }; this.setName = function(newName){ name = newName; }; this.getAge = function(){ return age; } this.setAge = function(newAge){ age = newAge; }; this.say = hello; this.introduce = function(){ alert(‘my name is :‘+this.getName()); } } })() Person.prototype.call = function(){ this.say(); } var Student = function(){ Person.call(this); } for(var i in Person.prototype){Student.prototype[i] = Person.prototype[i]} var s = new Student(); s.setName(‘xiaoli‘); s.getName();//xiaoli s.call();//helloworld
可以看到Student类继承了Person类,获得了Person类的公有方法和共有方法即prototype定义的方法。由于JavaScript并不原生支持封装,所以在JavaScript中实现封装一定要注意复杂性的问题。