在JavaScript中是沒(méi)有類的概念的,只有對(duì)象。無(wú)論是字符串,數(shù)值,數(shù)組還是函數(shù),其本質(zhì)都是對(duì)象。此外,JavaScript是允許自定義對(duì)象。什么是對(duì)象呢?簡(jiǎn)而言之,對(duì)象是帶有屬性和方法的特殊數(shù)據(jù)類型。以下是幾種常用的對(duì)象定義方式。
1、基于已有對(duì)象擴(kuò)充其屬性和方法
簡(jiǎn)單的創(chuàng)建一個(gè)對(duì)象,然后動(dòng)態(tài)地為其增加屬性和方法。
var object=new Object();
object.name="zhangsan";
object.sayName=function()
{
this.name=name;
}
object.sayName("lisi");
2、工廠方法
工廠方式的優(yōu)點(diǎn)在于你不需要每次擴(kuò)充方法和屬性,一次建成后就可以產(chǎn)生多個(gè)對(duì)象,無(wú)需關(guān)注創(chuàng)建細(xì)節(jié),甚至不需要關(guān)注具體類的類名。
function factory()
{
var object = new Object();
object.username = "zhangsan";
object.password = "123";
object.get = function()
{
return (this.username+","+this.password);
}
return object;
}
var object1 = factory();
object1.get();
var object2 = factory();
好的對(duì)象創(chuàng)建方式應(yīng)該滿足方法可以被多個(gè)對(duì)象共享,而屬性私有,使代碼更加簡(jiǎn)略。同時(shí),也可以將上述的程序改寫(xiě)為帶參數(shù)的工廠創(chuàng)建方式。改進(jìn)后的代碼如下:
function get(){
return (this.username+","+this.password);
}
function factory(username,password){
var object = new Object();
object.username = username;
object.password = password;
object.get = get;
return object;
}
var object1 = factory("zhangsan","123");
object1.get();
var object2 = factory("lisi","456");
3、構(gòu)造函數(shù)方式
使用構(gòu)造函數(shù)方式時(shí),JavaScript引擎會(huì)在第一行代碼執(zhí)行前為我們生成一個(gè)對(duì)象,同時(shí)含有一個(gè)隱藏的return語(yǔ)句,將生成的對(duì)象返回。因此,在函數(shù)體內(nèi),無(wú)需顯性地聲明。
function Person(){
//在執(zhí)行第一行代碼前,js自動(dòng)生成一個(gè)對(duì)象
this.username = "zhangsan";
this.password = "123";
this.get = function(){
return (this.username+","+this.password);
}
//隱藏的return語(yǔ)句,將生成的對(duì)象返回
}
var person = new Person();
person.get();
同理,也可以將其改為可傳遞參數(shù)的構(gòu)造函數(shù)。
4、使用原型(prototype)方式
單純使用原型方式定義對(duì)象無(wú)法在構(gòu)造函數(shù)中為屬性賦初值,只能在對(duì)象生成后再去改變屬性值。
function Person()
{
}
Person.prototype.username = "zhangsan";
Person.prototype.password = "123";
person.prototype.get = function(){
return (this.username+","+this.password);
}
var person = new Person();
person.username = "lisi";
person.password = "456";
person.get();
如果使用原型方式對(duì)象,那么生成的所有對(duì)象會(huì)共享原型中的屬性,這樣一個(gè)對(duì)象改變了該屬性也會(huì)反映到其他對(duì)象當(dāng)中。可以使用原型+構(gòu)造函數(shù)方式來(lái)解決這個(gè)問(wèn)題,使對(duì)象之間的屬性互不干擾,各個(gè)對(duì)象間共享同一個(gè)方法。這也是推薦使用的方法。
function Person()
{
this.username = new Array();
this.password = "";
}
Person.prototype.get = function()
{
return (this.username+","+this.password);
}
var p1 = new Person();
var p2 = new Person();
p1.username.push("zhangsan");
p1.password = "123";
p2.username.push("lisi");
p2.password = "456";
p1.get();
p2.get();
5、動(dòng)態(tài)原型方式
在構(gòu)造函數(shù)中,通過(guò)標(biāo)志量讓所有對(duì)象共享一個(gè)方法,而每個(gè)對(duì)象都擁有自己的屬性。
function Person()
{
this.username = "zhangsan";
this.password = "123";
if(typeof Person.flag == "undefined")
{
Person.prototype.get = function()
{
return (this.username+","+this.password);
}
Person.flag = true;
}
}
var p1 = new Person();
var p2 = new Person();
p1.get();
p2.get();
結(jié)言
以上為個(gè)人學(xué)習(xí)過(guò)程中的總結(jié),若有更好的方法或者其他的理解,歡迎留言或者私信探討。