工廠模式
工廠模式是軟件工程領域一種廣為人知的設計模式,而由於在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 = {},但工廠函數只能在局部添加
各自適用場合:
構造函數:適應用於大型項目,屬性以及方法時常變換的項目
工廠函數:適應用於小型項目,或者正在制作過程還沒有成型的項目
參考了一些資料,以及個人的一點見解,希望能幫忙補充~~~