2019-06-13 JS(構(gòu)造函數(shù)、new、this)

(本文摘錄于阮一峰老師所寫文章,https://wangdoc.com/javascript/basic/index.html,作個人學習使用。)

構(gòu)造函數(shù)

1、JavaScript 語言的對象體系,不是基于“類”的,而是基于構(gòu)造函數(shù)(constructor)和原型鏈(prototype)。
JavaScript 語言使用構(gòu)造函數(shù)(constructor)作為對象的模板。

2、為了與普通函數(shù)區(qū)別,構(gòu)造函數(shù)名字的第一個字母通常大寫。

構(gòu)造函數(shù)的特點有兩個。
(1)函數(shù)體內(nèi)部使用了this關(guān)鍵字,代表了所要生成的對象實例。
(2)生成對象的時候,必須使用new命令。

new指令

3、如果忘了使用new命令,直接調(diào)用構(gòu)造函數(shù),構(gòu)造函數(shù)就變成了普通函數(shù),并不會生成實例對象。this這時代表全局對象。

4、使用new命令時,它后面的函數(shù)依次執(zhí)行下面的步驟。
(1)創(chuàng)建一個空對象,作為將要返回的對象實例。
(2)將這個空對象的原型,指向構(gòu)造函數(shù)的prototype屬性。
(3)將這個空對象賦值給函數(shù)內(nèi)部的this關(guān)鍵字。
(4)開始執(zhí)行構(gòu)造函數(shù)內(nèi)部的代碼。

5、構(gòu)造函數(shù)內(nèi)部,this指的是一個新生成的空對象,所有針對this的操作,都會發(fā)生在這個空對象上。構(gòu)造函數(shù)之所以叫“構(gòu)造函數(shù)”,就是說這個函數(shù)的目的,就是操作一個空對象(即this對象)。
如果構(gòu)造函數(shù)內(nèi)部有return語句,而且return后面跟著一個對象,new命令會返回return語句指定的對象;否則,就會不管return語句,返回this對象。

6、函數(shù)內(nèi)部可以使用new.target屬性。如果當前函數(shù)是new命令調(diào)用,new.target指向當前函數(shù),否則為undefined。

7、構(gòu)造函數(shù)作為模板,可以生成實例對象。但是,有時拿不到構(gòu)造函數(shù),只能拿到一個現(xiàn)有的對象。我們希望以這個現(xiàn)有的對象作為模板,生成新的實例對象,這時就可以使用Object.create()方法。

this

8、this都有一個共同點:它總是返回一個對象。this就是屬性或方法“當前”所在的對象。

9、實質(zhì):
由于函數(shù)可以在不同的運行環(huán)境執(zhí)行,所以需要有一種機制,能夠在函數(shù)體內(nèi)部獲得當前的運行環(huán)境(context)。所以,this就出現(xiàn)了,它的設(shè)計目的就是在函數(shù)體內(nèi)部,指代函數(shù)當前的運行環(huán)境。

10、this主要有以下幾個使用場合。
(1)全局環(huán)境:全局環(huán)境使用this,它指的就是頂層對象window。
(2)構(gòu)造函數(shù):構(gòu)造函數(shù)中的this,指的是實例對象。
(3)對象的方法:如果對象的方法里面包含this,this的指向就是方法運行時所在的對象。該方法賦值給另一個對象,就會改變this的指向。

【注意】(1)obj和obj.foo儲存在兩個內(nèi)存地址,稱為地址一和地址二。obj.foo()這樣調(diào)用時,是從地址一調(diào)用地址二,因此地址二的運行環(huán)境是地址一,this指向obj。
(2)數(shù)組的map和foreach方法,允許提供一個函數(shù)作為參數(shù)。這個函數(shù)內(nèi)部不應該使用this。固定函數(shù)內(nèi)部this的另一種方法是將this當作foreach方法的第二個參數(shù),固定它的運行環(huán)境。
(3)避免回調(diào)函數(shù)中的 this。

11、綁定 this 的方法:JavaScript 提供了call、apply、bind這三個方法,來切換/固定this的指向。
(1)Function.prototype.call():函數(shù)實例的call方法,可以指定函數(shù)內(nèi)部this的指向(即函數(shù)執(zhí)行時所在的作用域),然后在所指定的作用域中,調(diào)用該函數(shù)。
(2)Function.prototype.apply():apply方法的作用與call方法類似,也是改變this指向,然后再調(diào)用該函數(shù)。唯一的區(qū)別就是,它接收一個數(shù)組作為函數(shù)執(zhí)行時的參數(shù)。apply方法的第一個參數(shù)也是this所要指向的那個對象,如果設(shè)為null或undefined,則等同于指定全局對象。
(3)Function.prototype.bind():bind方法用于將函數(shù)體內(nèi)的this綁定到某個對象,然后返回一個新函數(shù)。
bind方法每運行一次,就返回一個新函數(shù)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容