每一個對象都是引用類型創建的。
一、工廠模式
1 function createPerson(){ 2 var o=new Object(); 3 o.name=name; 4 o.sex=sex; 5 o.sayName=function(){ 6 alert(this.name); 7 } 8 return o; 9 } 10 11 var person1=new createPerson('zhangsan','男'); 12 var person2=new createPerson('wangwu','女');
特點:1、用函數來封裝,並以特定接口創建對象;2、有返回值
缺點:雖然解決了創建多個對象的問題,但沒有解決對象識別的問題(怎樣知道一個對象的類型)
二、構造函數模式(通過this實現)
用構造函數可以創建特定類型的對象,同時也可以創建自定義的構造函數,從而定義自定義對象類型的屬性和方法。
1 function Person(name,age){ 2 this.name=name; 3 this.age=age; 4 this.sayName=function(){ 5 alert(this.name); 6 } 7 }; 8 9 var person1=new Person('zhangsan',20); 10 var person2=new Person('wangwu',15);
與工廠模式的區別在於:
1、沒有顯式地創建對象;
2、直接將屬性和方法賦給了this對象
3、沒有return語句
三、原型模式(通過原型對象實現)
創建的每個函數都有一個prototype屬性,這個屬性是一個指針,指向一個對象,而這個對象包含了所有實例共享的屬性和方法。
因此可以將屬性和方法放在原型對象里面,讓所有實例都可以共享。
1 function Person(){}; 2 3 Person.prototype.name='zhangsan'; 4 Person.prototype.age=20; 5 Person.prototype.sayName=function(){ 6 alert(this.name); 7 } 8 9 var person1=new Person(); 10 person1.sayName(); //zhangsan 11 12 var person2=new Person(); 13 person2.sayName(); //zhangsan
先新建一個空的構造函數,然后將屬性和方法添加到原型對象里面,再創建實例對象,實例對象就擁有了原型對象里的屬性和方法。不管創建多少個實例對象,原型對象里的屬性和方法都是共享的。
四、組合構造函數模式和原型模式
構造函數模式用於定義實例屬性,原型模式用於定義方法和共享的屬性
1 function Person(name,age){ //構造函數模式 2 this.name=name; 3 this.age=age; 4 this.friends=['shelly','lucy']; 5 }; 6 7 Person.prototype.sayName=function(){ //原型模式 8 alert(this.name); 9 } 10 11 var person1=new Person('zhangsan',20); //構造函數模式 12 var person2=new Person('wangwu',15); 13 14 person1.friends.push('van'); 15 alert(person1.friends); //shelly,lucy,van 16 alert(person2.friends); //shelly,lucy
五、動態原型模式
就是將所有代碼裝在一起
六、寄生構造函數模式
1 function Person(){ 2 var o=new Object(); 3 o.name=name; 4 o.sex=sex; 5 o.sayName=function(){ 6 alert(this.name); 7 } 8 return o; 9 } 10 11 var person1=new Person('zhangsan','男'); 12 var person2=new Person('wangwu','女');
跟工廠模式很像,但是是構造函數創建得
七、穩妥構造函數模式