1.創建對象:
var person = new Object();person.name = "zhangsan";person.age = 30;person.job = "software engineer";person.sayName = function(){ alert(this.name);}person.sayName();缺點:創造不同的對象需要大量重復的代碼。
2.工廠模式:function createObject(name,age,job){ var o = new Object(); o.name = name; o.age = age; o.job = job; o.sayName = function (){ alert(this.name); } return o;}var person1 = createObject("zhangsan",20,"teacher");var person2 = createObject("lisi",30,"doctor");person1.sayName();person2.sayName();缺點:無法判斷對象的類型。alert(typeof person1);alert(person1instanceof Object);
3.構造函數模式:
(1)
function Person(name,age,job){ this.name = name; this.age = age; this.job = job; this.sayName = function (){ alert(this.name); }; }var person1 = new Person("zhangsan",20,"teacher");var person2 = new Person("lisi",30,"doctor");person1.sayName();person2.sayName();alert(person1.sayName == person2.sayName);缺點:sayName方法執行同樣的任務,但創建不同的對象時卻要不同的Function。
(2)function Person(name,age,job){ this.name = name; this.age = age; this.job = job; this.sayName = sayName; }function sayName(){ alert(this.name);}var person1 = new Person("zhangsan",20,"teacher");var person2 = new Person("lisi",30,"doctor");person1.sayName();person2.sayName();alert(person1.sayName == person2.sayName);缺點:(2)雖然解決了(1)的問題,但sayName是一個全局函數,卻只能被某個對象使用。如果對象由很多方法,就要定義很多全局函數,破壞了函數的封裝性。
4.原型模式:
(1)
function Person(){ }Person.PRototype.name = "zhangsan";Person.prototype.age = 30;Person.prototype.job = "teacher";Person.prototype.sayName = function(){ alert(this.name);}; var person1 = new Person();person1.sayName();var person2 = new Person();person2.sayName();alert(person1.sayName == person2.sayName);(2)function Person(){ }Person.prototype = { name:"zhangsan", age:30, job:"teacher", friends:["lisi","wangwu"], sayName:function(){ alert(this.name); }}; var person1 = new Person();var person2 = new Person();person1.friends.push("zhaoliu");alert(person1.friends);alert(person2.friends);alert(person1.friends == person2.friends);缺點:由(2)可以看出原型的缺點,由于共享的特性,在使用基本類型時可以使用隱藏的手段解決,引用類型會造成共享問題。
5.組合構造函數模式和原型模式function Person(name,age,job){ this.name = name; this.age = age; this.job = job; this.friends = ["wangwu","zhaoliu"]; }Person.prototype = { constructor:Person, sayName: function(){ alert(this.name); }}; var person1 = new Person("zhangsan",20,"teacher");var person2 = new Person("lisi",30,"doctor");person1.friends.push("liuqi");alert(person1.friends);alert(person2.friends);alert(person1.friends == person2.friends);alert(person1.sayName == person2.sayName);6.動態原型模式function Person(name,age,job){ this.name = name; this.age = age; this.job = job; this.friends = ["wangwu","zhaoliu"]; if(typeof this.sayName != "function"){ Person.prototype.sayName = function (){ alert(this.name); }; } } var person1 = new Person("zhangsan",20,"teacher");var person2 = new Person("lisi",30,"doctor");person1.friends.push("liuqi");alert(person1.friends);alert(person2.friends);alert(person1.friends == person2.friends);alert(person1.sayName == person2.sayName);7.寄生構造函數模式:function Person(name,age,job){ var o = new Object(); o.name = name; o.age = age; o.job = job; o.friends = ["wangwu","zhaoliu"]; o.sayName = function (){ alert(this.name); }; return o;} var person1 = new Person("zhangsan",20,"teacher");var person2 = new Person("lisi",30,"doctor");person1.friends.push("liuqi");alert(person1.friends);alert(person2.friends);alert(person1.friends == person2.friends);alert(person1.sayName == person2.sayName);8.穩妥構造函數模式:function Person(name,age,job){ var o = new Object(); o.sayName = function (){ alert(name); }; return o;} var person = Person("zhangsan",20,"teacher");person.sayName();特點:與寄生構造函數模式相似,不同點在于一是不使用new調用構造函數,二是在創建對象的實例方法中不使用this.
新聞熱點
疑難解答