構(gòu)造函數(shù)
構(gòu)造函數(shù):如用函數(shù)用來初始化(使用new運算符)一個新建的對象面殖,我們稱之為構(gòu)造函數(shù)(constructor)
普通函數(shù)
普通函數(shù):不使用new運算符的函數(shù)就是普通函數(shù)
構(gòu)造函數(shù)vs普通函數(shù)
從形式上看,一個函數(shù)被作為構(gòu)造函數(shù)還是普通函數(shù)執(zhí)行的唯一區(qū)別就是是否使用new
function Person(){
this.name = "zqq";
this.age = 28;
}
var p = new Person();
當以new調(diào)用構(gòu)造函數(shù)(執(zhí)行var p = new Person())時哭廉,函數(shù)內(nèi)部會發(fā)生以下情況:
1.創(chuàng)建一個空對象
var p = {};
2.this變量指向?qū)ο髉
Person.call(p)
3.p繼承了構(gòu)造函數(shù)Person()的原型
p.__proto__ = Person.prototype
4.執(zhí)行構(gòu)造函數(shù)Person()內(nèi)的代碼
構(gòu)造函數(shù)和普通函數(shù)的區(qū)別:
1.構(gòu)造函數(shù)使用new關(guān)鍵字調(diào)用脊僚;普通函數(shù)不用new關(guān)鍵字調(diào)用;
var p = new Person();
var p = Person();
2.構(gòu)造函數(shù)內(nèi)部可以使用this關(guān)鍵字遵绰;普通函數(shù)內(nèi)部不建議使用this辽幌,因為這時候this指向的是window全局對象,這樣無意間就會為window添加了一些全局變量或函數(shù)
2.1 在構(gòu)造函數(shù)內(nèi)部椿访,this指向的是構(gòu)造出來的新對象
2.2 在普通函數(shù)內(nèi)部舶衬,this指向的是window全局對象
3.構(gòu)造函數(shù)默認不用return返回值;普通函數(shù)一般都有return返回值
3.1 構(gòu)造函數(shù)會默認返回this赎离,也就是新的實例對象
3.2 普通函數(shù)如果沒有return值的話逛犹,返回undefined
3.3 如果使用了return,那返回值會根據(jù)return值的類型而有所不同
<a >這里涉及到要了解的知識點有基本數(shù)據(jù)類型和引用類型的區(qū)別</a>
3.3.1 return的是五種簡單數(shù)據(jù)類型:String,Number,Boolean,Null,Undefined的話梁剔,構(gòu)造函數(shù)會忽略return的值虽画,依然返回this對象;而普通函數(shù)會返回return后面的值
function Person(){
var a;
this.name = "zqq";
this.age = 28;
return a;
}
var p = new Person();//返回this對象
var p = Person();//因為a沒初始化荣病,所以a是undefined码撰,而undefined屬于簡單數(shù)據(jù)類型,所以返回undefined个盆,String,Number,Boolean,Null同理
3.3.2 如果return的是引用類型:Array,Date,Object,Function,RegExp,Error的話脖岛,構(gòu)造函數(shù)和普通函數(shù)都會返回return后面的值
function Person(){
var arr = [];
this.name = "zqq";
this.age = 28;
return arr;
}
var p = new Person();//返回arr空數(shù)組,Date,Object,Function,RegExp,Error同理
var p1 = new Person();//返回arr空數(shù)組颊亮,Date,Object,Function,RegExp,Error同理
4.構(gòu)造函數(shù)首字母建議大寫柴梆;普通函數(shù)首字母建議小寫
參考資料:
https://my.oschina.net/u/2395167/blog/658234
http://www.jb51.net/article/47871.htm