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());
說明:
- 在函數中定義對象,並定義對象的各種屬性,雖然屬性可以為方法,但是建議將屬性為方法的屬性定義到函數之外,這樣可以避免重復創建該方法。
- 引用該對象的時候,這里使用的是 var x = Parent()而不是 var x = new object(); 因為后者可能會出現很多問題(前者也成為工廠經典方式,后者稱之為混合工廠方式),不推薦使用new的方式使用該對象。
- 在函數的最后返回該對象。
- 不推薦使用這種方式創建對象,但應該了解。
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());
說明:
- 與工廠方式相比,使用構造函數方式創建對象無需在函數內部創建對象,而使用this指代,並而函數無需明確return。
- 同工廠模式一樣,雖然屬性的值可以為方法,仍建議將該方法定義在函數之外。
- 同樣的,不推薦使用這種方式創建對象,但仍需了解。
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());
說明:
- 函數中不對屬性進行定義。
- 利用prototype屬性對屬性進行定義。
- 同樣的額,不推薦使用這樣的方式創建對象。
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());
說明:
- 該模式是指混合搭配使用構造函數和原型方式。
- 將所有的屬性,不是方法的定義在函數中(構造函數的方式),將所有屬性值為方法的利用prototype在函數之外定義(原型方式)。
- 推薦使用這樣的方式創建對象,這樣有好處。
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());
說明:
- 動態原型方式可以理解為混合構造函數,原型方式的一個特例。
- 該模式中,屬性為方法的屬性直接在函數中進行了定義,但是因為
if(typeof Parent.lev == "undefined"){ Parent.prototype.lev = function(){ return this.name; } Parent.lev = true; } 從而保證創建該對象的實例時,屬性的方法不會被重復的創建。