封裝:通過將一個方法或者屬性聲明為私人的,可以讓對象的實現細節對其他對象保密以降低對象間的耦合程度,可以保持資料的保證性並對其修改方式加以約束,這樣可以使代碼更加可靠,更加易於調試。封裝是物件導向的設計的基石。。。
但是javascript不具備將成員聲明為公用或私用的任何內部機制,所以我們只能自己想辦法實現這種特徵。
私人屬性和方法:函數有範圍,在函數內用var聲明的變數在函數外部是無法訪問的,私人屬性和方法本質就是你希望在對象外部無法訪問的變數。
特權屬性和方法:建立屬性和方法時使用的this關鍵字,因為這些方法定義在建構函式的範圍中,所以他們可以訪問到私人的屬性跟方法,只有那些需要直接存取私人成員的方法才應該唄設計為特權方法。
公用屬性和方法:直接在prototype上定義的屬性跟方法,不可以訪問構造器內的私人成員,可以存取權限成員,子類會繼承所有的共有方法跟屬性。
共有靜態屬性跟方法:最好的理解方式就是把它想象成一個命名空間,實際上相當於把構造器作為一個命名空間來用。
01 // 封裝
02
03 var _packaging = function() {
04 //私人屬性和方法
05 var name = 'Darren';
06 var method = function() {
07
08 };
09 // 特權屬性和方法
10 this.title = 'Javascritp';
11 this.getName = function() {return name; };
12 };
13
14 // 共有屬性跟方法
15 _packaging.prototype = {
16 init: function() {}
17 };
18
19 // 共有靜態屬性跟方法
20 _packaging._name = 'Darren';
21 _packaging.alertName = function() {alert(_packaging._name);};
繼承:在javascript中實現繼承有兩種方式:類式繼承跟原型式繼承。例子:
view sourceprint?01 /* -- 類式繼承 -- */
02 //先聲明一個超類
03 function Person(name){
04 this.name = name;
05 }
06 //給這個超類的原型對象上添加方法 getName
07 Person.prototype.getName = function(){
08 return this.name;
09 }
10 //執行個體化這個超類
11 var a = new Person('Darren1')
12 alert(a.getName());
13 //再聲明類
14 function Programmer(name,sex){
15 //這個類中要調用超類Person的建構函式,並將參數name傳給它
16 Person.call(this,name);
17 this.sex = sex;
18 }
19 //這個子類的原型對象等於超類的執行個體
20 Programmer.prototype = new Person();
21 //因為子類的原型對象等於超類的執行個體,所以prototype.constructor這個方法也等於超類建構函式,你可以自己測試一下,如果沒這一步,alert(Programmer.prototype.constructor),這個是Person超類的引用,所以要從新賦值為自己本身
22 Programmer.prototype.constructor = Programmer;
23 //子類本身添加了getSex 方法
24 Programmer.prototype.getSex = function(){
25 return this.sex;
26 }
27 //執行個體化這個子類
28 var _m = new Programmer('Darren2','male');
29 //自身的方法
30 alert(_m.getSex());
31 //繼承超類的方法
32 alert(_m.getName());
view sourceprint?01 /* -- 原型式繼承 -- */
02 //clone()函數用來建立新的類Person對象
03 var clone = function(obj){
04 var _f = function(){};
05 //這句是原型式繼承最核心的地方,函數的原型對象為對象字面量
06 _f.prototype = obj;
07 return new _f;
08 }
09 //先聲明一個對象字面量
10 var Person = {
11 name:'Darren',
12 getName:function(){
13 return this.name;
14 }
15 }
16 //不需要定義一個Person的子類,只要執行一次複製即可
17 var Programmer = clone(Person);
18 //可以直接獲得Person提供的預設值,也可以添加或者修改屬性和方法
19 alert(Programmer.getName())
20 Programmer.name = 'Darren2'
21 alert(Programmer.getName())
22
23 //聲明子類,執行一次複製即可
24 var Someone = clone(Programmer);
馮尚實的部落格