(js)使用new對函數進行構造調用

js中的函數有兩種調用方式,一種是通過普通的聲明之后進行的調用。一種是通過new關鍵字進行構造調用。普通的調用就是依次執行函數內部的函數語句,如果有返回值則返回返回值,如果沒有則函數內部的聲明周期結束。但是,函數還有另一個調用方式,使用new關鍵字,將函數當做構造函數。js中沒有所謂獨立出來的構造函數的概念,所有的函數都用同樣的方式聲明,所以有了new這個關鍵字,js(ES6之前)只能通過這種方式實現構造器的構造。那么使用new關鍵字跟普通的調用有什么區別呢?

使用new關鍵字,比普通的函數調用,主要分為以下四個步驟:

  1. 建立一個空對象 。
  2. 將函數內部的this修正到上面新建的對象上來。
  3. 繼續執行函數的其它語句,并且將上面新建的對象的[[prototype]]屬性(ES6中稱為"__proto__")指向該構造函數。
  4. 如果函數沒有返回值或著函數有返回值,但是該返回值不是對象的話,則返回第一步建立的對象;如果函數有返回值,且返回值是對象的話,則忽略第一步建立的對象,返回默認返回的對象。

稍后我們會對上面的四句話逐一解析,首先我們看一看函數調用的兩種方式:

var fun = function () {
  var a = 2;
  console.log(a * 2);
}
//新建函數fun

fun();    //4
new fun();  //4

這樣看來,兩者似乎沒有區別,但是這里要注意,使用new進行構造調用時,函數是有返回值的。

...
var return1 = fun();    //4
var return2 = new fun();    //4

console.log(return1);    //undefined
console.log(return2);    //fun {}

上面的return2并沒有返回一個函數。

...
typeof return2;    //object
Object.prototype.toString.call(return2);    //[object Object]

其實它會返回一個空的對象。這也就是上面使用new關鍵詞的第一步,內部創建一個新的空對象

那么當函數內部有this時,結果會是怎樣的呢?

var fun = function () {
  this.a = 2;
  console.log(this.a * 2);
}

fun();    //4
new fun();    //4

var return1 = fun();    //4
var return2 = new fun();    //4

console.log(return1);    //undefined
console.log(return2);    //{ a: 2 }

使用new關鍵字后,在函數內部如果出現了this,則自動將this指向內部新建的對象上。最后返回時,因為this的緣故,對象上新建了a屬性,并且賦值返回。

修正定義的對象Object的[[prototype]]
雖然實例上的[[prototype]]屬性__proto__是ES6才作為規范出版的。但是在這之前chrome已經支持__proto__屬性,他指向對象的原型。

原型的問題相當復雜,單獨拿出來也可以當好幾篇文章的量來講。但是這并不是本文的重點。但是每一個對象從根部來說,繼承自Object。而Object.prototype上面定義了一些方法,有類似toString,valueOf等等等方法。對于對象來說,支持通過屬性鏈和方法鏈向上查詢。所以在一個對象實例中,如果沒有定義toString方法,但它還可以向上查詢,找到原型中的toString方法,進行調用。

同時的,有很多元素通過Object實現繼承。比如Function, Array, RegExp等等對象,它們也是對象,但是卻是繼承來自Object。

在這里,內部定義的對象,讓他繼承來自構造函數。

最后一步,也是最容易被忽略的一步,那就是當構造函數存在返回值時,并且返回值為對象時,返回對象而不返回之前定義的對象。

var fun = function () {
  this.a = 1;
  return {
    a: 2
  }
}
var obj = new fun();  //{ a:2 }

當然,上面說的Function,Array,RegExp也算Object的一種,如果返回他們同樣也會阻止默認的對象返回。

var fun = function () {
  this.a = 1;
  return function () {
    this.a = 2;
  }
}
var obj = new fun();  //function () { this.a = 2; }
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,048評論 6 542
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,414評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,169評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,722評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,465評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,823評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,813評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,000評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,554評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,295評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,513評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,035評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,722評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,125評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,430評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,237評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,482評論 2 379

推薦閱讀更多精彩內容

  • 普通創建對象和字面量創建對象不足之處:雖然 Object 構造函數或對象字面量都可以用來創建單個對象,但這些方式有...
    believedream閱讀 2,414評論 2 18
  • 第5章 引用類型(返回首頁) 本章內容 使用對象 創建并操作數組 理解基本的JavaScript類型 使用基本類型...
    大學一百閱讀 3,263評論 0 4
  • 一 常見命令 1.初始化一個代碼倉庫git init 2.如果使用git必須給git配置一個用戶名和郵箱給當前的g...
    cornerAnt閱讀 622評論 0 7
  • 明天就是除夕啦,今年年夜飯的餐桌上怎么少得了網紅雞這道硬菜咧!今天跟大家分享的這道菜叫大盤鴻運雞,寓意新的一年鴻運...
    桃之夭夭里閱讀 319評論 2 2
  • 姑娘托著腮,望著江邊,炊煙裊裊。 身邊的姐妹都取笑你,喲,又在想念哪個少年郎? 姑娘托著腮,一言不發,望著江邊的炊...
    楠木枝閱讀 243評論 0 0