面向對象之工廠模式與構造函數模式的區別


工廠模式

  工廠模式是軟件工程領域一種廣為人知的設計模式,而由於在ECMAScript中無法創建類,因此用函數封裝以特定接口創建對象。其實現方法非常簡單,也就是在函數內創建一個對象,給對象賦予屬性及方法再將對象返回即可。

 1 function createBlog(name, url) {
 2   var o = new Object();
 3   o.name = name;
 4   o.url = url;
 5   o.sayUrl= function() {
 6     alert(this.url);
 7   }
 8   return o;
 9 }
10  
11 var blog1 = createBlog('wuyuchang', 'http://www.jb51.net/');

 

可以看到工廠模式的實現方法非常簡單,解決了創建多個相似對象的問題,但是工廠模式卻無從識別對象的類型,因為全部都是Object,不像Date、Array等,因此出現了構造函數模式。

 

構造函數模式

  ECMAScript中構造函數可以創建特定類型的對象,類似於Array、Date等原生JS的對象。其實現方法如下:

 1   function Blog(name, url) {
 2     this.name = name;
 3     this.url = url;
 4     this.alertUrl = function() {
 5       alert(this.url);
 6     }
 7   }
 8   var blog = new Blog('wuyuchang', 'http://www.jb51.net/');
 9   //即為Blog的實例,也為Object的實例
10   console.log(blog instanceof Blog);  // true 
11   console.log(blog instanceof Object);  // true
 
構造函數與工廠函數之間差異:
1.工廠函數需要創建對象,以及必須有返回值
2.工廠函數針對的都是Object的對象模型,而構造函數可以匹配自定義的對象模型
  即前者不論創建什么都只有一個xx instanceof Object
  而后者根據自定義名而定類型,如上舉例所示
3.構造函數弊端,如果在全局中定義相同的局部變量,容易造成全局污染,因為this.xx如果在局部獲取不到,就會去全局中獲取
4.構造函數可以重寫,可以在全局中添加新屬性和方法Person.prototype = {},但工廠函數只能在局部添加
 
各自適用場合:
  構造函數:適應用於大型項目,屬性以及方法時常變換的項目
  工廠函數:適應用於小型項目,或者正在制作過程還沒有成型的項目
 
 
參考了一些資料,以及個人的一點見解,希望能幫忙補充~~~


免責聲明!

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



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