javascript - 《ES6標(biāo)準(zhǔn)入門》中關(guān)于修飾器的疑問
問題描述
修飾器對類的行為的改變,是代碼編譯時發(fā)生的,而不是在運(yùn)行時。這意味著,修飾器能在編譯階段運(yùn)行代碼。也就是說,修飾器本質(zhì)就是編譯時執(zhí)行的函數(shù)。
有以下幾個問題:
上面引用中說到:修飾器對類的行為的改變,是代碼編譯時發(fā)生的,而不是在運(yùn)行時,這句中的編譯時、運(yùn)行時、發(fā)生分別是什么意思?
修飾器本質(zhì)就是編譯時執(zhí)行的函數(shù),這里的執(zhí)行和問題一中的發(fā)生是一個意思嗎?
修飾器一般用在哪些地方?
書上的解釋看的比較模糊,麻煩大神細(xì)細(xì)解說,非常感謝!
問題解答
回答1:編譯時,可以大致理解為,在代碼開始運(yùn)行之前,JS引擎將代碼轉(zhuǎn)化成機(jī)器可以運(yùn)行的操作的時候。也就是說,這個過程無法在運(yùn)行時候加以干涉的,因?yàn)樗陂_始運(yùn)行之前就已經(jīng)完成了。
而運(yùn)行時,則是指你代碼編譯以后機(jī)器可以運(yùn)行的操作開始運(yùn)行時,也就是你寫的那些東西,從機(jī)器操作變成了你能實(shí)際在電腦上看到的東西的時候。
至于發(fā)生,并沒有特殊含義,就是指這些改變是在JS引擎將代碼轉(zhuǎn)化為機(jī)器操作過程中完成的。
執(zhí)行和發(fā)生,大致可以認(rèn)為是因和果的關(guān)系。改變,一般搭配的動詞是“發(fā)生”,函數(shù),一般搭配的詞是“執(zhí)行”。發(fā)生強(qiáng)調(diào)的是前后狀態(tài)的對比,也就是說,因?yàn)榘l(fā)生了某件事,導(dǎo)致之后和之前不同了。而執(zhí)行則側(cè)重過程,執(zhí)行一個操作,也就是將操作里每個步驟都做一遍,并沒有刻意去注重前后是否有不同。所以,這邊應(yīng)該是修飾器=編譯時執(zhí)行的函數(shù),這個函數(shù)執(zhí)行之后導(dǎo)致的結(jié)果是類行為有所改變。
既然,上面說了,是對類行為的改變,所以修飾器一般用在類聲明時候?qū)︻惱锩娣椒ê蛯傩缘男揎棥?/p>回答2:
說白了,代碼大體分編譯階段和運(yùn)行階段,你可以理解成編譯階段把代碼解析成一個樹,到了運(yùn)行階段時,按照編譯形成的樹進(jìn)行運(yùn)行。你可以在github上搜索一下core-decorators.js,這個庫就是一個修飾器的實(shí)例。
相關(guān)文章:
1. Docker for Mac 創(chuàng)建的dnsmasq容器連不上/不工作的問題2. javascript - QWebEngineView 如何爬 angular 的動態(tài)數(shù)據(jù)?3. javascript - 使用angular 的ui-sref 中出現(xiàn)了中文參數(shù),點(diǎn)擊跳轉(zhuǎn)后瀏覽器的地址欄里出現(xiàn)轉(zhuǎn)義后的%AE....%a%44. java - ConcurrentHashMap中的get()方法為什么可以不加鎖?5. java - 郵箱如何發(fā)送html內(nèi)容6. html5 - 這個代碼顯示功能如何實(shí)現(xiàn)?7. javascript - 用JS 七牛上傳圖片出現(xiàn)文件已存在的錯誤(file exists)8. java - 字節(jié)流轉(zhuǎn)成字符串之后,在通過字符串轉(zhuǎn)成字節(jié)流后的文件為什么會不一樣?9. css3 - 圖片等比例縮放10. java - 如何理解“不要通過共享內(nèi)存來通信,而應(yīng)該通過通信來共享內(nèi)存”?
