javascript - 《ES6標(biāo)準(zhǔn)入門》中關(guān)于修飾器的疑問(wèn)
問(wèn)題描述
修飾器對(duì)類的行為的改變,是代碼編譯時(shí)發(fā)生的,而不是在運(yùn)行時(shí)。這意味著,修飾器能在編譯階段運(yùn)行代碼。也就是說(shuō),修飾器本質(zhì)就是編譯時(shí)執(zhí)行的函數(shù)。
有以下幾個(gè)問(wèn)題:
上面引用中說(shuō)到:修飾器對(duì)類的行為的改變,是代碼編譯時(shí)發(fā)生的,而不是在運(yùn)行時(shí),這句中的編譯時(shí)、運(yùn)行時(shí)、發(fā)生分別是什么意思?
修飾器本質(zhì)就是編譯時(shí)執(zhí)行的函數(shù),這里的執(zhí)行和問(wèn)題一中的發(fā)生是一個(gè)意思嗎?
修飾器一般用在哪些地方?
書(shū)上的解釋看的比較模糊,麻煩大神細(xì)細(xì)解說(shuō),非常感謝!
問(wèn)題解答
回答1:編譯時(shí),可以大致理解為,在代碼開(kāi)始運(yùn)行之前,JS引擎將代碼轉(zhuǎn)化成機(jī)器可以運(yùn)行的操作的時(shí)候。也就是說(shuō),這個(gè)過(guò)程無(wú)法在運(yùn)行時(shí)候加以干涉的,因?yàn)樗陂_(kāi)始運(yùn)行之前就已經(jīng)完成了。
而運(yùn)行時(shí),則是指你代碼編譯以后機(jī)器可以運(yùn)行的操作開(kāi)始運(yùn)行時(shí),也就是你寫(xiě)的那些東西,從機(jī)器操作變成了你能實(shí)際在電腦上看到的東西的時(shí)候。
至于發(fā)生,并沒(méi)有特殊含義,就是指這些改變是在JS引擎將代碼轉(zhuǎn)化為機(jī)器操作過(guò)程中完成的。
執(zhí)行和發(fā)生,大致可以認(rèn)為是因和果的關(guān)系。改變,一般搭配的動(dòng)詞是“發(fā)生”,函數(shù),一般搭配的詞是“執(zhí)行”。發(fā)生強(qiáng)調(diào)的是前后狀態(tài)的對(duì)比,也就是說(shuō),因?yàn)榘l(fā)生了某件事,導(dǎo)致之后和之前不同了。而執(zhí)行則側(cè)重過(guò)程,執(zhí)行一個(gè)操作,也就是將操作里每個(gè)步驟都做一遍,并沒(méi)有刻意去注重前后是否有不同。所以,這邊應(yīng)該是修飾器=編譯時(shí)執(zhí)行的函數(shù),這個(gè)函數(shù)執(zhí)行之后導(dǎo)致的結(jié)果是類行為有所改變。
既然,上面說(shuō)了,是對(duì)類行為的改變,所以修飾器一般用在類聲明時(shí)候?qū)︻惱锩娣椒ê蛯傩缘男揎棥?/p>回答2:
說(shuō)白了,代碼大體分編譯階段和運(yùn)行階段,你可以理解成編譯階段把代碼解析成一個(gè)樹(shù),到了運(yùn)行階段時(shí),按照編譯形成的樹(shù)進(jìn)行運(yùn)行。你可以在github上搜索一下core-decorators.js,這個(gè)庫(kù)就是一個(gè)修飾器的實(shí)例。
相關(guān)文章:
1. 關(guān)于docker下的nginx壓力測(cè)試2. angular.js使用$resource服務(wù)把數(shù)據(jù)存入mongodb的問(wèn)題。3. angular.js - angularjs的自定義過(guò)濾器如何給文字加顏色?4. docker-machine添加一個(gè)已有的docker主機(jī)問(wèn)題5. 為什么我ping不通我的docker容器呢???6. docker - 如何修改運(yùn)行中容器的配置7. docker安裝后出現(xiàn)Cannot connect to the Docker daemon.8. nignx - docker內(nèi)nginx 80端口被占用9. Docker for Mac 創(chuàng)建的dnsmasq容器連不上/不工作的問(wèn)題10. docker鏡像push報(bào)錯(cuò)
