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

工廠模式設計模式

  工廠模式是軟件工程領域一種廣爲人知的設計模式,而因爲在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等,所以出現了構造函數模式。this

 

構造函數模式url

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

 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 = {},但工廠函數只能在局部添加
 
各自適用場合:
  構造函數:適應用於大型項目,屬性以及方法時常變換的項目
  工廠函數:適應用於小型項目,或者正在製做過程尚未成型的項目
 
 
參考了一些資料,以及我的的一點看法,但願能幫忙補充~~~
相關文章
相關標籤/搜索