關於物件導向的幾種模式和個人理解

2021-07-29 12:03:32 字數 2869 閱讀 3624

關於物件導向的幾種模式和個人理解。

//object建構函式:

var person = new

object();

person.name = "lisi";

person.age = 25;

//字面量形式:

var person =

缺點:使用同乙個介面建立很多物件,會產生大量的重複**。

為了解決這種問題,推出了工廠模式

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");

不同之處:

缺點:使用建構函式的主要問題,就是每個方法都要在每個例項上重新建立一次。並且不同函式上的同名函式是不相等的,以下**證明這一點:

alert(person1.sayname == person2.sayname); //false
然而,建立兩個完全相同任務的function例項的確沒有必要,況且有this物件在,根本不用再執行**前就把函式繫結到物件上面。因此,大家可以向下面這樣,通過把函式定義轉移到建構函式外部來解決這個問題

function

person

(name, age, job)

function

sayname

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

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

這樣確實解決了兩個函式做同一件事的問題,但是新的問題又來了:在全域性作用局下只為某個物件定義乙個函式,這讓全域性作用域有點名副其實。而且更讓人無法接受的是:如果物件需要定義很多的方法,那麼就要定義很多的全域性函式,於是,我們這個自定義的引用型別就毫無封裝性可言了。

於是,又推出了原型模式

function

person

(){}

person.prototype.name = "nicholas";

person.prototype.age = 29;

person.prototype.job = "software engineer";

person.prototype.sayname = function

();var person1 = new person();

person1.sayname(); //"nicholas"

var person2 = new person();

person2.sayname(); //"nicholas"

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

通過建構函式方式建立新物件,與建構函式不同的是,這些屬性和方法都是可以共享的。

補充

更簡單的原型語句:

function

person

(){}

person.prototype =

};

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.friends); //false

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

在這個例項中,例項屬性都是建構函式中定義的,而由所有例項共享的屬性constructor和方法sayname()則是在原型中定義的。而修改person1中的friends(向其中新增乙個新的字串),並不會影響到person2.friends,因為他們分別引用了不用的陣列.

物件導向幾種設計模式

幾種方式建立物件 工廠 建構函式 混合模式 拷貝模式 字面量 引用型別和值型別區別 記憶體分配機制不一樣 引用型別 建立乙個變數 記憶體中儲存的是變數真實入口的位址 值型別 建立乙個變數,記憶體建立乙個區域 變數賦值是否的區別 將乙個值型別賦值給另乙個變數,實際上新建立乙個區域 引用型別,只是建立乙...

關於Java nofity wait的個人理解

首先notify,wait的經典場景是生產者,消費者模型 importorg.slf4j.logger created by wcl on 17 9 17.public classconsumerimplementsrunnable public voidrun 消費 1,當前數量 name,con...

物件導向中的幾種設計模式

1.為什麼會出現單例模式呢 在同一作用域下會出現相同的姓名時,就需使用這個單例模式。單例模式一般都會結合閉包一起來使用的 let name 張三 let age 20 let 男 let name 李四 let age 21 let 男 2.單例模式是幹嘛的 把描述當前事務的資訊進行分組歸類 減少全...