舉個通俗的例子理解一下: 有人想要造一千個金幣柿祈,并且要每個金幣上面刻有不同的編號哈误,最簡單的方法就是,造一個金幣的模子躏嚎,然后再各自刻各自的編號蜜自, 構造函數就是這個金幣的模子,你每次new一下卢佣,就是造一個金幣.
構造函數和普通函數的區(qū)別:
1.名字:構造函數首字母建議大寫重荠;普通函數首字母建議小寫
2.內容:構造函數內部可以使用this關鍵字;普通函數內部不建議使用this虚茶,因為這時候this指向的是window全局對象戈鲁,這樣無意間就會為window添加了一些全局變量或函數(關于導致this的原因會在下面介紹)
- 在構造函數內部,this指向的是構造出來的新對象
- 在普通函數內部嘹叫,this指向的是window全局對象
構造函數默認不用return返回值婆殿;普通函數一般都有return返回值
- 構造函數會默認返回this,也就是新的實例對象
- 普通函數如果沒有return值的話罩扇,返回undefined
- 如果使用了return婆芦,那返回值會根據return值的類型而有所不同
這里涉及到要了解的知識點有基本數據類型和引用類型的區(qū)別
- return的是五種簡單數據類型:String,Number,Boolean,Null,Undefined的話,構造函數會忽略return的值暮蹂,依然返回this對象寞缝;而普通函數會返回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屬于簡單數據類型荆陆,所以返回undefined,String,Number,Boolean,Null同理
- 如果return的是引用類型:Array,Date,Object,Function,RegExp,Error的話集侯,構造函數和普通函數都會返回return后面的值
function Person(){
var arr = [];
this.name = "zqq";
this.age = 28;
return arr;
}
var p = new Person();//返回arr空數組被啼,Date,Object,Function,RegExp,Error同理
var p1 = Person();//返回arr空數組,Date,Object,Function,RegExp,Error同理
3.調用:構造函數使用new關鍵字調用棠枉;普通函數不用new關鍵字調用浓体。
var p = new Person();
var p = Person();
當以new調用構造函數(執(zhí)行var p = new Person())時,函數內部會發(fā)生以下情況:
1.創(chuàng)建一個空對象
var p = {};
2.this變量指向對象p
Person.call(p) //解釋了上述this指向的問題
3.p繼承了構造函數Person()的原型
p.__proto__ = Person.prototype
4.執(zhí)行構造函數Person()內的代碼
5.return 對象p