關於物件導向的幾種模式和個人理解。
//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.單例模式是幹嘛的 把描述當前事務的資訊進行分組歸類 減少全...