(本文摘錄于阮一峰老師所寫文章,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ù)