javascript - 《ES6標準入門》中關于修飾器的疑問
問題描述
修飾器對類的行為的改變,是代碼編譯時發生的,而不是在運行時。這意味著,修飾器能在編譯階段運行代碼。也就是說,修飾器本質就是編譯時執行的函數。
有以下幾個問題:
上面引用中說到:修飾器對類的行為的改變,是代碼編譯時發生的,而不是在運行時,這句中的編譯時、運行時、發生分別是什么意思?
修飾器本質就是編譯時執行的函數,這里的執行和問題一中的發生是一個意思嗎?
修飾器一般用在哪些地方?
書上的解釋看的比較模糊,麻煩大神細細解說,非常感謝!
問題解答
回答1:編譯時,可以大致理解為,在代碼開始運行之前,JS引擎將代碼轉化成機器可以運行的操作的時候。也就是說,這個過程無法在運行時候加以干涉的,因為它在開始運行之前就已經完成了。
而運行時,則是指你代碼編譯以后機器可以運行的操作開始運行時,也就是你寫的那些東西,從機器操作變成了你能實際在電腦上看到的東西的時候。
至于發生,并沒有特殊含義,就是指這些改變是在JS引擎將代碼轉化為機器操作過程中完成的。
執行和發生,大致可以認為是因和果的關系。改變,一般搭配的動詞是“發生”,函數,一般搭配的詞是“執行”。發生強調的是前后狀態的對比,也就是說,因為發生了某件事,導致之后和之前不同了。而執行則側重過程,執行一個操作,也就是將操作里每個步驟都做一遍,并沒有刻意去注重前后是否有不同。所以,這邊應該是修飾器=編譯時執行的函數,這個函數執行之后導致的結果是類行為有所改變。
既然,上面說了,是對類行為的改變,所以修飾器一般用在類聲明時候對類里面方法和屬性的修飾。
回答2:說白了,代碼大體分編譯階段和運行階段,你可以理解成編譯階段把代碼解析成一個樹,到了運行階段時,按照編譯形成的樹進行運行。你可以在github上搜索一下core-decorators.js,這個庫就是一個修飾器的實例。
相關文章:
1. [python2]local variable referenced before assignment問題2. thinkPHP5中獲取數據庫數據后默認選中下拉框的值,傳遞到后臺消失不見。有圖有代碼,希望有人幫忙3. mysql主從 - 請教下mysql 主動-被動模式的雙主配置 和 主從配置在應用上有什么區別?4. 求救一下,用新版的phpstudy,數據庫過段時間會消失是什么情況?5. linux運維 - python遠程控制windows如何實現6. python小白,關于函數問題7. django - Python error: [Errno 99] Cannot assign requested address8. python小白 關于類里面的方法獲取變量失敗的問題9. Python2中code.co_kwonlyargcount的等效寫法10. android - 請問一下 類似QQ音樂底部播放 在每個頁面都顯示 是怎么做的?
