開篇
function Dog() { // Dog 對象}`
var bigHuang = new Dog() // bigHuang dog的實例`
由來
面向?qū)ο笫怯嬎銠C語言的一種標(biāo)志械拍,他們有類的概念夺饲,而通過類,我們可以創(chuàng)建無數(shù)個對象去使用該類的方法和屬性县钥,這是極好的秀姐。但是在
ECMAScript是沒有類的概念的,這就產(chǎn)生了一些問題若贮,但是無數(shù)的能人志士相出了辦法囊扳,用函數(shù)去模擬類,于是我們誕生了構(gòu)造函數(shù)兜看。锥咸。
需要具備的JS能力
js基礎(chǔ)知識,知道對象细移,等基本引用類型搏予。
屬性操作符
下次在說把
正題
方式一 - 工廠模式
工廠模式是設(shè)計模式中一個廣為流傳的模式,這種模式抽象了創(chuàng)建具體對象的過程弧轧。如下雪侥,
function createPerson(name, age, job) {
var o = new Object()
o.name = name
o.age = age;
o.sayName = function () {alert (this.name)}
return o;
}
var person1 = createPerson('111', 18, 'aa');
var person2 = createPerson('222', 19, 'bb');
// 創(chuàng)建了這樣一種方式,類似于投入一種固定類的產(chǎn)品精绎,產(chǎn)出一種相同狀態(tài)的產(chǎn)品速缨,工廠模式給出了這樣一種可能,我們能造出無數(shù)種這樣的數(shù)據(jù)代乃,
只是旬牲,我們?nèi)稳徊荒茏R別出他是什么對象類型的仿粹,類似于我們都知道 '' 是字符串類型的樣子。我們需要知道他的對象類型原茅。
方式二 - 構(gòu)造函數(shù)模式
function Person(name, age, job) {
this.name = name;
this.age = age;
this.sayName = function () {
alert(this.name);
}
}
var person1 = new Person('123', 19, 'engineer');
var person2 = new Person('24', 24, 'fale');
// 對比上述的兩種寫法吭历,我么看到了
* 沒有創(chuàng)建一個對象
* 將屬性,方法賦給了 this
* 沒有 return 返回值
* 函數(shù)名稱首字母大寫
* 創(chuàng)建實例時擂橘,必須要用到 new 關(guān)鍵字
-
我們稱以大寫字母開頭的函數(shù)為構(gòu)造函數(shù)晌区,且到我們定義實例時是需要用到需要用 new 去實現(xiàn)的,這一步執(zhí)行了什么通贞?
創(chuàng)建了一個新對象
將構(gòu)造函數(shù)的作用域賦給新對象
執(zhí)行構(gòu)造函數(shù)里的代碼(賦值朗若,屬性,方法)
返回新對象
通過控制臺打印我們能把person1 打印出來看下昌罩,在proto里有一個constructor.
`
alert(person1.constructor === Person) // true
alert(person2.constructor === Person) // true
`
通過該屬性我們可以知道了 person2 是指向到 Person 的捡偏,(終于找到組織了)..
這個方法就本身來說,不是我們所推薦的方式峡迷。因為有 instanceof 這個操作符银伟。
alert(person1 instanceof Object); // true
alert(person1 instanceof Person); // true
alert(person2 instanceof Object); // true
alert(person2 instanceof Person); // true
注意事項
**
不要將構(gòu)造函數(shù)當(dāng)作是函數(shù)使用,雖然它本身就是函數(shù)绘搞,任何函數(shù)彤避,只要通過 new 關(guān)鍵字去引用那都是被看成是構(gòu)造函數(shù),但是夯辖,一般不建議這樣做琉预,我們要做的是遵守約定。