javascript
【JavaScript学习】JavaScript对象创建
1.最簡單的方法,創(chuàng)建一個對象,然后添加屬性
1 var person = new Object(); 2 person.age = 23; 3 person.name = "David"; 4 person.job = "student"; 5 person.sayName = function () 6 { 7 alert(this.name); 8 }; 9 10 //類似于定義鍵值對或者json數(shù)據(jù)格式的定義方法. 11 var person = 12 { 13 age:23, 14 name:"David", 15 job:"student", 16 sayName:function() 17 { 18 alert(this.name); 19 } 20 };該方法簡單明了,缺點就是當(dāng)要創(chuàng)建多個同類型的對象時,重復(fù)性的代碼較多.
2.解決方法1中的問題,借鑒許多軟件設(shè)計的思想,引入工廠模式,即構(gòu)造一個創(chuàng)建對象的工廠函數(shù),實現(xiàn)對象創(chuàng)建的功能.
1 function createPerson(name,age,job) 2 { 3 var o = new Object(); 4 o.name = name; 5 o.age = age; 6 o.job = job; 7 o.sayName = function() 8 { 9 alert(this.name); 10 }; 11 return o; 12 } 13 var person = createPerson("David",23,"student");該方法解決了代碼重復(fù)的問題,可以利工廠函數(shù)創(chuàng)建出多個對象.但此方法返回的對象都是Object類型,不能標識創(chuàng)建的對象的類型屬性.
3.構(gòu)造函數(shù)模式,創(chuàng)建構(gòu)造函數(shù),結(jié)合new操作符可以創(chuàng)建對象
1 function Person(name,age,job) 2 { 3 this.name = name; 4 this.age = age; 5 this.job = job; 6 this.sayName = function() 7 { 8 alert(this.name); 9 } 10 } 11 var person1 = new Person("David",23,"student"); 12 var person2 = Person("Bill",21,"Boss"); 13 person1.sayName(); //顯示David 14 person2.sayName(); //顯示undefined 15 sayName(); //顯示Billperson1 結(jié)合new 操作創(chuàng)建了一個對象實例,但person2沒有結(jié)合new,直接調(diào)用Person(name,age,job)函數(shù),此時,函數(shù)的作用域里的this指的是window,因而出現(xiàn)后兩行的顯不結(jié)果.安全的構(gòu)造函數(shù)可以避免出現(xiàn)上述的問題
1 function Person(name,age,job) 2 { 3 if(this instanceof Person) 4 { 5 this.name = name; 6 this.age = age; 7 this.job = job; 8 this.sayName = function() 9 { 10 alert(this.name); 11 } 12 } 13 else 14 return new Person(name,age,job); 15 }this instanceof Person 檢測當(dāng)前this是否指向到Person對象. 這樣改進后,將不會出上面描述的問題.關(guān)鍵是理解this是指向當(dāng)前執(zhí)行環(huán)境的,關(guān)于函數(shù)的執(zhí)行環(huán)境以及作用域鏈,以后再作介紹.一般類型的方法是一樣的,可以共享,但使用該方法,每創(chuàng)建一個對象,都會創(chuàng)建一個方法的副本,產(chǎn)生代碼的重復(fù)性.
4.解決該問題,可以把方法置于構(gòu)造函數(shù)體外定義,構(gòu)造函數(shù)內(nèi)只需要引用在構(gòu)造函數(shù)外定義的函數(shù)即可.
1 function Person(name,age,job) 2 { 3 this.name = name; 4 this.age = age; 5 this.job = job; 6 this.sayName = sayName; 7 } 8 9 function sayName() 10 { 11 alert(this.name); 12 }這樣可以解決方法共享的問題,但會引入其他問題,這樣將導(dǎo)致global scope里將會有許有方法,使用global scope過于龐大,這樣不便于代碼管理,方法和相應(yīng)的屬性分開.
5.原型模式.
1 function Person(){} 2 Person.prototype.name = "David"; 3 Person.prototype.age = 23; 4 Person.prototype.job = "student"; 5 Person.prototype.sayName = function() 6 { 7 alert(this.name); 8 }; 9 var person1 = new Person(); 10 var person2 = new Person();通過設(shè)置構(gòu)造函數(shù)的原型,來達到對象中屬性和方法的共享,person1和person2中對應(yīng)的屬性和方法都是一樣的. 雖然這種方法,實現(xiàn)了代碼共享,減少了代碼的重復(fù),但并不符合人們的需求,一般都是需要各個對象既有共享的方法和屬性,又有各自的特點和屬性.而且這種方法不能傳遞初始化參數(shù),默認構(gòu)造的對象都具有與原型相同的屬性.
6.原型和構(gòu)造函數(shù)混合模式 利用原型來設(shè)置方法,達到方法的共享,利用構(gòu)造函數(shù)來實現(xiàn)屬性的設(shè)置,支持初始化參數(shù)傳遞,達到屬性的個性化
1 function Person(name,age,job) 2 { 3 this.name = name; 4 this.age = age; 5 this.job = job; 6 } 7 Person.prototype = { 8 constructor:Person, 9 sayName:function() 10 { 11 alert(this.name); 12 } 13 }; 14 var person1 = new Person("David",23,"student"); 15 var person2 = new Person("Bill",21,"Boss");這樣person1和person2對應(yīng)的屬性不共享,但方法sayName共享.該方法基本可以滿足一般用戶創(chuàng)建對象的需求.該方法存在一點不好,就是方法和屬性要分開設(shè)置,而且在利用原型設(shè)置方法時,若是重寫原型,則必須指定constructor為構(gòu)造函數(shù),若是只設(shè)置相應(yīng)的屬性,如Person.prototype.sayName = function(){};則不需要指定constructor屬性.
7.動態(tài)原型模式 可以將屬性和方法設(shè)置一起置于構(gòu)造函數(shù)內(nèi).
1 function Person(name,age,job) 2 { 3 this.name = name; 4 this.age = age; 5 this.job = job; 6 7 if(typeof this.sayName != "function") 8 { 9 Person.prototype.sayName = function() 10 { 11 alert(this.name); 12 }; 13 } 14 }檢測this.sayName是否已經(jīng)定義,若定義了,則不用設(shè)置原型.否則,設(shè)置原型定義sayName函數(shù).這種方法同樣可以達到屬性個性化,方法共享的要求
?????? 總結(jié),以上就是幾種關(guān)于對象創(chuàng)建的方法的總結(jié),逐步完善,從每種方法存在的問題出發(fā),從而尋找更好的解決方法,這樣可以進一步的理解javascript中各種機制設(shè)計的最初目的.
?
總結(jié)
以上是生活随笔為你收集整理的【JavaScript学习】JavaScript对象创建的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微软sharepoint团队博客
- 下一篇: JS计算本周一和本周五的日期