普通函數與構造函數的區別


JavaScript中存在構造函數與函數兩個概念。

這可能會給初學者造成一定的困擾,難不成存在兩種函數。

然而事實這兩種函數的構成完全一樣,無論從長相還是氣質都是一模一樣的。

區別點在於,所扮演覺得不同,同一個人在不同的場合具有不同的角色。

就比如曹操對將要出征的曹彰所說"居家為父子受事為君臣"。

同是曹彰,在家里與曹操的是父子關系,領兵在外則是上下級關系。

構造函數與普通函數也是如此,代碼實例如下:

function Foo(){}  
Foo();
let f=new Foo();

Foo()是作為普通函數使用,使用new 調用則是作為構造函數使用。

使用方式的不同,自然會產生很多差別,下面分別做一下介紹。

一.首字母大小寫慣例:

這不是語法規定,而是使用慣例。

作為構造函數,函數的首字母通常會使用大寫形式,作為普通函數則習慣於用小寫形式。

構造函數扮演的就是標准面向對象語言中類的角色,ES2015新增class類概念。

遵循此原則有利於團隊合作開發,外觀即可推斷函數將要扮演的角色。

二.函數中this的指向不同:

普通函數中的this,在嚴格模式下指向undefined,非嚴格模式下指向window對象。

而構造函數的this則是指向它創建的對象實例。

function Foo(){
  console.log(this===window);
}  
Foo();

代碼運行效果截圖如下:

a:3:{s:3:\"pic\";s:43:\"portal/201811/25/171321f0u83fuh5upshtsh.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

非嚴格模式下指向window對象,嚴格模式下指向undefined,不再演示。

function Foo(){
  this.webName="螞蟻部落";
}  
let f=new Foo();
console.log(f.webName);

代碼運行效果截圖如下:

a:3:{s:3:\"pic\";s:43:\"portal/201811/25/171354schcf4t1xari2xzx.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

構造函數中的this指向它所創建的對象實例。

三.return語句的使用:

普通函數通常要使用return語句返回一個值,如果沒有return語句默認返回undefined。

而構造函數則一般不需要return語句,當然也可以有return語句,感覺使用return完全沒有意義。

返回值分為兩種情況:

(1).如果構造函數return一個值類型數據,那么完全忽略此return語句,和沒有一樣。

(2).如果構造函數return一個引用類型數據,那么它的返回值就是此引用類型數據,而不是創建的對象實例。

四.箭頭函數:

ES2015新增箭頭函數,它只能作為普通使用,不能用作構造函數。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM