至今我們學(xué)習(xí)了很多調(diào)用函數(shù)的方式:
圓括號(hào)直接調(diào)用
對(duì)象打點(diǎn)調(diào)用
定時(shí)器調(diào)用
事件處理函數(shù)調(diào)用
數(shù)組枚舉調(diào)用
他們體現(xiàn)的不同點(diǎn)就是函數(shù)上下文不同 他們的this不一樣
現(xiàn)在我們學(xué)習(xí)新的函數(shù)調(diào)用方法,用new運(yùn)算符來(lái)調(diào)用函數(shù)
試著用new運(yùn)算符調(diào)用一個(gè)函數(shù):
function fun(){
alert("你好")
}
new fun(); //你好
函數(shù)可以執(zhí)行
也就是說(shuō)new是一個(gè)全新的調(diào)用函數(shù)的方式
我們關(guān)心的是,這個(gè)函數(shù)的上下文是
function fun(){
// alert(this) //object object
this.name ="小明";
this.age = 12;
this.sex="男";
}
var obj = new fun();
alert(obj.age); //12
//console.log(obj); //fun{name:"小明",age:"12",”sex:"男"}
用new運(yùn)算符調(diào)用一個(gè)函數(shù)的時(shí)候 ,會(huì)經(jīng)歷四步走
1,函數(shù)內(nèi)部悄悄的創(chuàng)建一個(gè)局部變量,是一個(gè)空對(duì)象{}
2, 函數(shù)將自己的上下文設(shè)置為這個(gè){},即所有語(yǔ)句中的this就表示這個(gè)空對(duì)象
3,函數(shù)將執(zhí)行所有語(yǔ)句
4,所有語(yǔ)句執(zhí)行后,函數(shù)將return這個(gè)對(duì)象,函數(shù)將把自己的上下文返回.
所以,遇見(jiàn)new操作符,馬上想起四步走
目前為止,我們發(fā)現(xiàn),這個(gè)new運(yùn)算符能夠調(diào)用函數(shù),還能返回一個(gè)對(duì)象 ,
//構(gòu)造函數(shù),可以當(dāng)做一個(gè)”類(lèi)“ ,描述的是一類(lèi)對(duì)象需要擁有的屬性
function People(name,age,sex){
// alert(this) //object object
this.name = name;
this.age = age;
this.sex=sex;
}
//類(lèi)的實(shí)例
var xiaoming = new People("小明","12","男");
var xiaohong = new People("小紅","15","女");
console.log(xiaoming); //fun{name:"小明",age:"12",”sex:"男"}
console.log(xiaohong);
我們發(fā)現(xiàn)用new操作符,可以返回具有相同屬性群的對(duì)象。
我們說(shuō),Peoples可以認(rèn)為是一個(gè)”類(lèi)“,xiaomming ,xiaohong,xiaoqing都是這個(gè)類(lèi)的”實(shí)例“(instance)。
JS中沒(méi)有類(lèi)的概念,我們這里只有JAVA C++ C#做一個(gè)類(lèi)比,JS中只有構(gòu)造函數(shù)。當(dāng)一個(gè)函數(shù)被new操作符調(diào)用的時(shí)候,這個(gè)函數(shù)就是一個(gè)構(gòu)造函數(shù),它總能返回一類(lèi)具有相同屬性群的對(duì)象,感覺(jué)在”構(gòu)造東西“,所以這個(gè)函數(shù)很神奇,像一個(gè)模子,在制作類(lèi)似的對(duì)象。
為了提醒其他程序員,這是一個(gè)必須用new調(diào)用的函數(shù),換句話(huà)說(shuō)提醒別人這是一個(gè)構(gòu)造函數(shù),這類(lèi)函數(shù)的名字必須首字母大寫(xiě)。
我們看不用new操作符調(diào)用構(gòu)造函數(shù)會(huì)發(fā)生什么 ;
function People(name,age,sex){
// alert(this) //object object
this.name = name;
this.age = age;
this.sex=sex;
}
People("小明","12","男");
alert(age); //12
由于我們直接調(diào)用了構(gòu)造函數(shù),此時(shí)就是標(biāo)準(zhǔn)的函數(shù)直接加圓括號(hào)調(diào)用 ,函數(shù)里面的this是window對(duì)象,所以,此時(shí)name age sex 都被設(shè)置成了window對(duì)象的屬性,我們知道window對(duì)象的屬性是全局變量。此時(shí)能夠彈出12.
JS中沒(méi)有Class關(guān)鍵字(ECMAScript2016增加了Class關(guān)鍵字),我們就是使用new操作符的時(shí)候,會(huì)按"四步走"創(chuàng)建一些具有相同屬性群的實(shí)例,些時(shí)就感覺(jué)有了”類(lèi)“,JS只提”構(gòu)造函數(shù)‘,不提“類(lèi)”。
Javascript不是一個(gè)面向?qū)ο螅∣O)的語(yǔ)言,它只是基于對(duì)象(bo).
小題目:
function fun(){}
這個(gè)函數(shù)是不是一個(gè)構(gòu)造函數(shù)?答案是不知道,因?yàn)橹灰胣ew操作符調(diào)用一個(gè)函數(shù),此時(shí)這個(gè)函數(shù)就是一個(gè)構(gòu)造函數(shù)。至于函數(shù)名字沒(méi)有大寫(xiě),那只是習(xí)慣,不是語(yǔ)言要求
再來(lái),這個(gè)函數(shù)是不是構(gòu)造函數(shù):
function People(name,age){
this.name = name;
this.age = age;
}
答案也是不確定!因?yàn)橛胣ew調(diào)用它就是一個(gè)構(gòu)造函數(shù),不用new調(diào)用就不是
var obj = People("小明",12);
函數(shù)根本就沒(méi)有返回值,此時(shí)obj就是Null
obj == null //true
obj.age; //報(bào)錯(cuò)
**所以構(gòu)造函數(shù)沒(méi)有什么 ,就是全新的函數(shù)調(diào)用方式 **