JavaScript中對(duì)象的定義方式

在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é),若有更好的方法或者其他的理解,歡迎留言或者私信探討。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容