JS物件導向程式設計之建立物件模式

2021-07-05 06:29:56 字數 3542 閱讀 7896

function

createperson

(name,age,job);

return o;

}var person1=createperson("nicholas",29,"software engineer");

var person2=createperson("greg",27,"doctor");

優點:

抽象了建立具體物件的過程,解決了建立多個相似物件的問題

缺點:

沒有解決物件識別的問題(即怎樣知道乙個物件的型別)

function

person

(name ,age,job);

}var person1=new person("nicholas",29,"software engineer");

var person2=new person("greg",27,"doctor");

建構函式始終都應該以乙個大寫字母開頭,而非建構函式則應該以乙個小寫字母開頭。任何函式,只要通過new操作符來呼叫,那它就可以作為建構函式,而任何函式,如果不通過new操作符來呼叫,那它跟普通函式也不會有什麼兩樣。

建構函式模式的優點:

解決了物件識別的問題:person1和person2分別儲存著person的乙個不同的例項。這兩個物件又有乙個constructor(建構函式)屬性,該屬性指向person,如下所示:

alert(person1.constructor==person); //true

alert(person2.constructor==person); //true

建構函式模式的缺點:

每個方法都要在每個例項上重新建立一遍。以這種方式建立函式,會導致不同的作用域鏈和識別符號解析,但建立function新例項的機制仍然是相同的,然而建立兩個完成同樣任務的function例項是沒有必要的。

function

person

()person.prototype=

};var person1=new person();

var person2=new person();

person1.friends.push("van");

alert(person1.friends); //"shelby,court,van"

alert(person2.friends); //"shelby,court,van"

alert(person1.friends==person2.friends); //true

原型模式優點:

可以讓所有物件例項共享它所包含的屬性和方法,也就是不用在建構函式中定義物件例項的資訊,而是可以將這些資訊直接新增到原型物件中。

原型模式缺點:

1.它省略了為建構函式傳遞初始化引數這一環節,結果所有例項在預設情況下都將取得相同的屬性值

2.原型模式最大的問題也是其共享的本性導致的。特別是對於包含引用屬性型別值的屬性,問題比較突出,比如上面**中的person1.friends==person2.friends.

function

person

(name,age,job)

person.prototype=

};var person1=new person("nicholas",29,"software engineer");

var person2=new person("greg",27,"doctor");

person1.friends.push("van");

alert(person1.friends); //"shelby,count,van"

alert(person2.friends); //"shelby,count"

alert(person1.friends===person2.frineds); //false

alert(person1.sayname===person2.sayname); //true

組合模式優點:

1.每個例項都會有自己的乙份例項屬性的副本,但同時又共享著對方法的引用,最大限度地節省了記憶體

2.這種混成模式還支援向建構函式傳遞引數

這種建構函式與原型混成的模式,是目前在ecmascript 中使用最廣泛、認同度最高的一種建立自定義型別的方法。可以說,這是用來定義引用型別的一種預設模式。

function

person

(name ,age, job)

}}var friend=new person("nicholas",29,"software engineer");

friend.sayname();

動態原型模式優點:

它把所有資訊都封裝在了建構函式中,而通過在建構函式中初始化原型(僅在必要的情況下),又保持了同時使用建構函式和原型的優點。

if語句檢查的可以是初始化之後應該存在的任何屬性或方法——不必用一大堆if語句檢查每個屬性和每個方法,只要檢查其中乙個即可。

注意:

在使用動態原型模式時,不能使用物件字面量重寫原型。如果在已經建立了例項的情況下重寫原型,那麼就會切斷現有例項與新原型之間的聯絡。

function

person

(name , age , job);

return o;

}var friends=new person("nicholas",29,"software engineer");

friends.sayname(); //"nicholas"

除了使用new操作符並把使用的包裝函式叫做建構函式之外,這個模式跟工廠模式其實是一模一樣的。建構函式在不返回值的情況下,缺省會返回新物件例項。而通過在建構函式的末尾新增乙個return語句,可以重寫呼叫建構函式時返回的值。

注意:

關於寄生建構函式模式,返回的物件與建構函式或者與建構函式的原型屬性之間沒有關係,也就是說,建構函式返回的物件與在建構函式外部建立的物件沒什麼不同。不能依賴instanceof操作符來確定物件型別。建議在可以使用其他模式的情況下,不要使用這種模式。

function

person

(name,age,job);

//返回物件

return o;

}var friends=person("nicholas",29,"software engineer");

friends.sayname(); //"nicholas"

穩妥建構函式遵循與寄生建構函式類似的模式,但有兩點不同:

1.例項方法不引用this

2.不使用new操作符呼叫建構函式

注意:

變數friends中儲存的是乙個穩妥物件,而除了呼叫sayname()方法外,沒有別的方式可以訪問其資料成員。

穩妥建構函式模式提供的這種安全性,使得它非常適合在某些安全執行環境——例如,adsafe(www.adsafe.org)和caja(提供的環境下使用。

物件導向的程式設計之建立物件

物件的定義 無序屬性的集合,屬性的值可以是基本值 物件或者函式.每個物件都是基於乙個應用型別建立的,這個引用型別可以是內建的 例如objectarraymath 也可以是使用者自定義的.所有的物件都是繼承自object的,因此我們可以從object著手建立物件.通過new 關鍵字建立物件 var p...

js物件導向程式設計之建構函式

工廠模式是乙個比較廣為人知的模式,這種模式將細節抽象出來。如下 function createperson name,age,job returno var person1 createperson ds 12,dada var person2 createperson ds2 122,dada2 ...

JS物件導向程式設計 物件

一般面向過程的寫法都是寫很多function,壞處 1.復用不好 2.函式名稱容易重複衝突 下面介紹物件導向的寫法 在js中每個函式function都是乙個物件。比如,下面這個就是乙個物件,我們在使用的時候就可以當作物件來使用。function helloworld 使用下面測試函式 呼叫該函式就會...