JS 物件導向的小雜碎

來源:互聯網
上載者:User

封裝:通過將一個方法或者屬性聲明為私人的,可以讓對象的實現細節對其他對象保密以降低對象間的耦合程度,可以保持資料的保證性並對其修改方式加以約束,這樣可以使代碼更加可靠,更加易於調試。封裝是物件導向的設計的基石。。。

但是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);

馮尚實的部落格

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.