至今我們學(xué)習(xí)了很多調(diào)用函數(shù)的方式:
圓括號直接調(diào)用
對象打點(diǎn)調(diào)用
定時器調(diào)用
事件處理函數(shù)調(diào)用
數(shù)組枚舉調(diào)用
他們體現(xiàn)的不同點(diǎn)就是函數(shù)上下文不同 他們的this不一樣
現(xiàn)在我們學(xué)習(xí)新的函數(shù)調(diào)用方法柒昏,用new運(yùn)算符來調(diào)用函數(shù)
試著用new運(yùn)算符調(diào)用一個函數(shù):
function fun(){
alert("你好")
}
new fun(); //你好
函數(shù)可以執(zhí)行
也就是說new是一個全新的調(diào)用函數(shù)的方式
我們關(guān)心的是垂券,這個函數(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)用一個函數(shù)的時候 ,會經(jīng)歷四步走
1,函數(shù)內(nèi)部悄悄的創(chuàng)建一個局部變量,是一個空對象{}
2, 函數(shù)將自己的上下文設(shè)置為這個{},即所有語句中的this就表示這個空對象
3,函數(shù)將執(zhí)行所有語句
4,所有語句執(zhí)行后,函數(shù)將return這個對象惫皱,函數(shù)將把自己的上下文返回.
所以,遇見new操作符尤莺,馬上想起四步走
目前為止逸吵,我們發(fā)現(xiàn),這個new運(yùn)算符能夠調(diào)用函數(shù)缝裁,還能返回一個對象 扫皱,
//構(gòu)造函數(shù)足绅,可以當(dāng)做一個”類“ ,描述的是一類對象需要擁有的屬性
function People(name,age,sex){
// alert(this) //object object
this.name = name;
this.age = age;
this.sex=sex;
}
//類的實例
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操作符韩脑,可以返回具有相同屬性群的對象氢妈。
我們說,Peoples可以認(rèn)為是一個”類“段多,xiaomming ,xiaohong,xiaoqing都是這個類的”實例“(instance)首量。
JS中沒有類的概念,我們這里只有JAVA C++ C#做一個類比进苍,JS中只有構(gòu)造函數(shù)加缘。當(dāng)一個函數(shù)被new操作符調(diào)用的時候,這個函數(shù)就是一個構(gòu)造函數(shù)觉啊,它總能返回一類具有相同屬性群的對象拣宏,感覺在”構(gòu)造東西“,所以這個函數(shù)很神奇杠人,像一個模子勋乾,在制作類似的對象。
為了提醒其他程序員嗡善,這是一個必須用new調(diào)用的函數(shù)辑莫,換句話說提醒別人這是一個構(gòu)造函數(shù),這類函數(shù)的名字必須首字母大寫罩引。
我們看不用new操作符調(diào)用構(gòu)造函數(shù)會發(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ù)各吨,此時就是標(biāo)準(zhǔn)的函數(shù)直接加圓括號調(diào)用 ,函數(shù)里面的this是window對象袁铐,所以揭蜒,此時name age sex 都被設(shè)置成了window對象的屬性,我們知道window對象的屬性是全局變量昭躺。此時能夠彈出12.
JS中沒有Class關(guān)鍵字(ECMAScript2016增加了Class關(guān)鍵字),我們就是使用new操作符的時候伪嫁,會按"四步走"創(chuàng)建一些具有相同屬性群的實例领炫,些時就感覺有了”類“,JS只提”構(gòu)造函數(shù)‘张咳,不提“類”帝洪。
Javascript不是一個面向?qū)ο螅∣O)的語言,它只是基于對象(bo).
小題目:
function fun(){}
這個函數(shù)是不是一個構(gòu)造函數(shù)?答案是不知道脚猾,因為只要用new操作符調(diào)用一個函數(shù)葱峡,此時這個函數(shù)就是一個構(gòu)造函數(shù)。至于函數(shù)名字沒有大寫龙助,那只是習(xí)慣砰奕,不是語言要求
再來,這個函數(shù)是不是構(gòu)造函數(shù):
function People(name,age){
this.name = name;
this.age = age;
}
答案也是不確定!因為用new調(diào)用它就是一個構(gòu)造函數(shù)军援,不用new調(diào)用就不是
var obj = People("小明",12);
函數(shù)根本就沒有返回值仅淑,此時obj就是Null
obj == null //true
obj.age; //報錯
**所以構(gòu)造函數(shù)沒有什么 ,就是全新的函數(shù)調(diào)用方式 **