這個系列主要探討的是javascript面向對象的編程,前面已經着重介紹了一下js的繼承,下面想簡單的說一下js如何實現封裝的特性。javascript
咱們知道面向對象的語言實現封裝是把成員變量和方法用一個類包圍起來,對類中變量的訪問只能經過已定義的接口。封裝能夠算是一種信息隱藏技術,java經過private修飾符將成員變量私有化,並提供對外修改的接口,以控制類中的成員變量的訪問和修改。固然在這些方法中能夠對數據進行一些加工。java
在前面文章已經介紹了js的屬性問題,那麼在js中如何實現對類的屬性隱藏呢?這裏封裝有會有什麼蔽端。編程
下面看一下實現封裝的代碼:this
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裏使用必定得注意,避免過分封裝。下面看一下封裝對繼承有沒有什麼影響。spa
代碼以下:prototype
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中實現封裝必定要注意複雜性的問題。code