構造函數:如用函數用來初始化(使用new運算符)一個新建的對象,咱們稱之爲構造函數(constructor)segmentfault
普通函數:不使用new運算符的函數就是普通函數數組
從形式上看,一個函數被做爲構造函數仍是普通函數執行的惟一區別就是是否使用new函數
function Person(){ this.name = "zqq"; this.age = 28; } var p = new Person();
當以new調用構造函數(執行var p = new Person())時,函數內部會發生如下狀況:this
1.建立一個空對象.net
var p = {};
2.this變量指向對象pprototype
Person.call(p)
3.p繼承了構造函數Person()的原型code
p.__proto__ = Person.prototype
4.執行構造函數Person()內的代碼htm
1.構造函數使用new關鍵字調用;普通函數不用new關鍵字調用;對象
var p = new Person(); var p = Person();
2.構造函數內部能夠使用this關鍵字;普通函數內部不建議使用this,由於這時候this指向的是window全局對象,這樣無心間就會爲window添加了一些全局變量或函數blog
2.1 在構造函數內部,this指向的是構造出來的新對象 2.2 在普通函數內部,this指向的是window全局對象
3.構造函數默認不用return返回值;普通函數通常都有return返回值
3.1 構造函數會默認返回this,也就是新的實例對象 3.2 普通函數若是沒有return值的話,返回undefined 3.3 若是使用了return,那返回值會根據return值的類型而有所不一樣
3.3.1 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同理 3.3.2 若是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 = new Person();//返回arr空數組,Date,Object,Function,RegExp,Error同理
4.構造函數首字母建議大寫;普通函數首字母建議小寫
參考資料:
https://my.oschina.net/u/2395...
http://www.jb51.net/article/4...