js五種設計模式


1、js工廠模式

  

 1 var lev=function(){
 2        return  "嘿哈"; 
 3 };
 4 function Parent(){
 5     var Child = new object();
 6     Child.name = "李小龍";
 7     Child.age = "30";
 8     Child.lev = lev;
 9     return Child;
10         
11 };
12 var x=Parent();
13  alert(x.name);
14  alert(x.lev());

說明:

  1. 在函數中定義對象,並定義對象的各種屬性,雖然屬性可以為方法,但是建議將屬性為方法的屬性定義到函數之外,這樣可以避免重復創建該方法。
  2. 引用該對象的時候,這里使用的是 var x = Parent()而不是 var x = new object(); 因為后者可能會出現很多問題(前者也成為工廠經典方式,后者稱之為混合工廠方式),不推薦使用new的方式使用該對象。
  3. 在函數的最后返回該對象。
  4. 不推薦使用這種方式創建對象,但應該了解。  

2、js構造函數模式

 1 var lev=function(){
 2        return  "嘿哈"; 
 3 };
 4 function Parent(){
 5     this.name = "李小龍";
 6     this.age = "30";
 7     this.lev = lev;     
 8 };
 9 var x=Parent();
10  alert(x.name);
11  alert(x.lev());

 

說明:

  1. 與工廠方式相比,使用構造函數方式創建對象無需在函數內部創建對象,而使用this指代,並而函數無需明確return。
  2. 同工廠模式一樣,雖然屬性的值可以為方法,仍建議將該方法定義在函數之外。
  3. 同樣的,不推薦使用這種方式創建對象,但仍需了解。

3、js原型模式

 1 var lev=function(){
 2        return  "嘿哈"; 
 3 };
 4 function Parent(){
 5     Parent.prototype.name = "李小龍";
 6     Parent.prototype.age = "30";
 7     Parent.prototype.lev = lev;     
 8 };
 9 var x=Parent();
10  alert(x.name);
11  alert(x.lev());

說明:

  1. 函數中不對屬性進行定義。
  2. 利用prototype屬性對屬性進行定義。
  3. 同樣的額,不推薦使用這樣的方式創建對象。

4、構造函數+原型的js混合模式(推薦)

 1 function Parent(){
 2     this.name = "李小龍";
 3     this.age = "30";     
 4 };
 5 Parent.prototype.lev=function(){
 6 return this.name;
 7 }
 8 var x=Parent();
 9  alert(x.name);
10  alert(x.lev());

說明:

  1. 該模式是指混合搭配使用構造函數和原型方式。
  2. 將所有的屬性,不是方法的定義在函數中(構造函數的方式),將所有屬性值為方法的利用prototype在函數之外定義(原型方式)。
  3. 推薦使用這樣的方式創建對象,這樣有好處。

5、構造函數+原型的動態原型模式(推薦)

 1 function Parent(){
 2     this.name = "李小龍";
 3     this.age = "30"; 
 4     if(typeof Parent.lev == "undefined"){
 5         Parent.prototype.lev = function(){
 6             return this.name;
 7         }
 8         Parent.lev = true;
 9     }    
10 };
11 
12 var x=Parent();
13  alert(x.lev());

說明:

  1. 動態原型方式可以理解為混合構造函數,原型方式的一個特例。
  2. 該模式中,屬性為方法的屬性直接在函數中進行了定義,但是因為
    if(typeof Parent.lev == "undefined"){
              Parent.prototype.lev = function(){ return this.name;  } Parent.lev = true;  } 從而保證創建該對象的實例時,屬性的方法不會被重復的創建。 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM