(本文摘錄于阮一峰老師所寫文章,https://wangdoc.com/javascript/basic/index.html课竣,作個人學(xué)習(xí)使用嘉赎。)
構(gòu)造函數(shù)
1、JavaScript 語言的對象體系于樟,不是基于“類”的公条,而是基于構(gòu)造函數(shù)(constructor)和原型鏈(prototype)。
JavaScript 語言使用構(gòu)造函數(shù)(constructor)作為對象的模板迂曲。
2靶橱、為了與普通函數(shù)區(qū)別,構(gòu)造函數(shù)名字的第一個字母通常大寫路捧。
構(gòu)造函數(shù)的特點(diǎn)有兩個关霸。
(1)函數(shù)體內(nèi)部使用了this關(guān)鍵字,代表了所要生成的對象實(shí)例杰扫。
(2)生成對象的時候队寇,必須使用new命令。
new指令
3章姓、如果忘了使用new命令佳遣,直接調(diào)用構(gòu)造函數(shù)炭序,構(gòu)造函數(shù)就變成了普通函數(shù),并不會生成實(shí)例對象苍日。this這時代表全局對象惭聂。
4、使用new命令時相恃,它后面的函數(shù)依次執(zhí)行下面的步驟辜纲。
(1)創(chuàng)建一個空對象,作為將要返回的對象實(shí)例拦耐。
(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屬性。如果當(dāng)前函數(shù)是new命令調(diào)用呀非,new.target指向當(dāng)前函數(shù)坚俗,否則為undefined镜盯。
7岸裙、構(gòu)造函數(shù)作為模板,可以生成實(shí)例對象速缆。但是降允,有時拿不到構(gòu)造函數(shù),只能拿到一個現(xiàn)有的對象艺糜。我們希望以這個現(xiàn)有的對象作為模板剧董,生成新的實(shí)例對象幢尚,這時就可以使用Object.create()方法。
this
8翅楼、this都有一個共同點(diǎn):它總是返回一個對象尉剩。this就是屬性或方法“當(dāng)前”所在的對象。
9毅臊、實(shí)質(zhì):
由于函數(shù)可以在不同的運(yùn)行環(huán)境執(zhí)行理茎,所以需要有一種機(jī)制,能夠在函數(shù)體內(nèi)部獲得當(dāng)前的運(yùn)行環(huán)境(context)管嬉。所以皂林,this就出現(xiàn)了,它的設(shè)計目的就是在函數(shù)體內(nèi)部蚯撩,指代函數(shù)當(dāng)前的運(yùn)行環(huán)境础倍。
10、this主要有以下幾個使用場合胎挎。
(1)全局環(huán)境:全局環(huán)境使用this沟启,它指的就是頂層對象window。
(2)構(gòu)造函數(shù):構(gòu)造函數(shù)中的this犹菇,指的是實(shí)例對象美浦。
(3)對象的方法:如果對象的方法里面包含this,this的指向就是方法運(yùn)行時所在的對象项栏。該方法賦值給另一個對象浦辨,就會改變this的指向。
【注意】(1)obj和obj.foo儲存在兩個內(nèi)存地址沼沈,稱為地址一和地址二流酬。obj.foo()這樣調(diào)用時,是從地址一調(diào)用地址二列另,因此地址二的運(yùn)行環(huán)境是地址一芽腾,this指向obj。
(2)數(shù)組的map和foreach方法页衙,允許提供一個函數(shù)作為參數(shù)摊滔。這個函數(shù)內(nèi)部不應(yīng)該使用this。固定函數(shù)內(nèi)部this的另一種方法是將this當(dāng)作foreach方法的第二個參數(shù)店乐,固定它的運(yùn)行環(huán)境艰躺。
(3)避免回調(diào)函數(shù)中的 this。
11眨八、綁定 this 的方法:JavaScript 提供了call腺兴、apply、bind這三個方法廉侧,來切換/固定this的指向页响。
(1)Function.prototype.call():函數(shù)實(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方法每運(yùn)行一次蝌箍,就返回一個新函數(shù)