//自定義構(gòu)造函數(shù)創(chuàng)建對(duì)象
//1.先自定義一個(gè)構(gòu)造函數(shù)
function Person(name,age){
this.name = name;
this.age = age;
this.sayHi= function () {
console.log("我叫"+this.name+"我今年"+this.age)
}
}
//2.然后創(chuàng)建對(duì)象
var per1 = new Person("曉陽(yáng)",18);
console.log(per1.name); //曉陽(yáng)
console.log(per1.age); //18
per1.sayHi(); //我叫曉陽(yáng)我今年18
console.log(per1 instanceof Person); //true
注意點(diǎn):函數(shù)和自定義構(gòu)造函數(shù)的區(qū)別?
- 普通函數(shù)在調(diào)用的時(shí)候直接 functionName(); 調(diào)用就行,自定義構(gòu)造函數(shù)是為了創(chuàng)建對(duì)象的!需要寫(xiě)new
- 自定義構(gòu)造函數(shù)的首字母要大寫(xiě)!
自定義構(gòu)造函數(shù)能不能分辨出對(duì)象到底屬于什么類型?
- "對(duì)象" instanceof "類型";
- 判斷這個(gè)對(duì)象是不是Person類型,結(jié)果為布爾類型!
自定義構(gòu)造函數(shù)實(shí)例化一個(gè)對(duì)象時(shí),干了哪幾件事
var per1 = new Person("曉陽(yáng)",18);
這段代碼在后臺(tái)做了幾件事情,也可以說(shuō)是它的執(zhí)行流程:
1.在內(nèi)存"堆"中申請(qǐng)了一塊空間儲(chǔ)存對(duì)象
2.把this設(shè)置為當(dāng)前對(duì)象
3.設(shè)置對(duì)象的屬性和方法的值
4.把this返回
自定義構(gòu)造函數(shù)的優(yōu)缺點(diǎn):
自定義構(gòu)造函數(shù)它知道自己從哪里來(lái),通過(guò)誰(shuí)生產(chǎn)出來(lái)的,能判斷出實(shí)例化對(duì)象的類型!
缺點(diǎn):它無(wú)法數(shù)據(jù)共享.這一點(diǎn)可以通過(guò)原型對(duì)象解決!
自定義構(gòu)造函數(shù)創(chuàng)建對(duì)象所帶來(lái)的問(wèn)題:(也就是它的缺點(diǎn))
//自定義構(gòu)造函數(shù)
function Dog (name){
this.name = name;
this.say = function (){
console.log("汪汪汪,我要吃狗糧")
}
}
//實(shí)例化對(duì)象
var dog1 = new Dog("金毛");
var dog2 = new Dog("泰迪");
//調(diào)用對(duì)象的方法
dog1.say();
dog2.say();
console.log(dog1.say==dog2.say)//flash
以上面代碼為例:
最后一行代碼返回的為flash,自定義構(gòu)造函數(shù)每次實(shí)例化出來(lái)的對(duì)象,構(gòu)造函數(shù)都會(huì)創(chuàng)建一次,所以say方法在內(nèi)存中創(chuàng)建了兩次!他們?cè)趦?nèi)存中的地址不同,所以不等!
但是因?yàn)樗鼈兊倪壿嫼凸δ芤粯?這樣就導(dǎo)致了代碼冗余,影響性能所以這里就需要用到原型對(duì)象!