注冊登錄

微信小程序支持es6嗎?談微信小程序開發(fā)!

2020-09-28
導讀:2017年6月14日,微信小程序支持es6嗎已經(jīng)是當下微信小程序開發(fā)最熱門的話題,下面將從多方面來談?wù)勎⑿判〕绦蛑С謊s6及相關(guān)的設(shè)置相關(guān)的內(nèi)容。...

微信小程序支持es6嗎已經(jīng)是當下微信小程序開發(fā)最熱門的話題,下面將從多方面來談?wù)勎⑿判〕绦蛑С謊s6及相關(guān)的設(shè)置相關(guān)的內(nèi)容。

可子類化的內(nèi)建對象(Subclassable Built-ins)

在ES6中,像Array,Date和Dom元素這樣的內(nèi)建對象都可以被子類化。

微信小程序支持es6嗎?談微信小程序開發(fā)!

通過子類工廠實現(xiàn)簡單的合成器(Simple mixins via subclass factories)

mixin在javascript里可以看作是一種從別的對象"借用"功能的方法。每一個新定義的對象都有一個 prototype屬性,其他的對象就可以從這里"借用"功能。這里的功能可以是一個屬性,也可以是一個方法。

Mixin支持在一個系統(tǒng)中降解功能的重復性,增加功能的重用性。在一些應用程序也許需要在所有的對象實體共享行為的地方,我們能夠通過在一個Mixin中維護這個共享的功能,來很容易的避免任何重復,而因此專注于只實現(xiàn)我們系統(tǒng)中真正彼此不同的功能。

在 ES6 中,我們可以采用全新的基于類繼承的 “mixin” 模式設(shè)計更優(yōu)雅的“語義化”接口,這是因為 ES6 中的 extends 可以繼承動態(tài)構(gòu)造的類,這一點和其他的靜態(tài)聲明類的編程語言不同。當 ES6 類繼承另一個類,被繼承的類可以是通過任意表達式創(chuàng)建的動態(tài)類。這個特性可以允許實現(xiàn)一種合成器模式,用一個函數(shù)來將一個類 C 映射到一個新的繼承了C的類。

微信小程序支持es6嗎?談微信小程序開發(fā)!

mixin 式繼承的基本形式:

 

微信小程序支持es6嗎?談微信小程序開發(fā)!

用 mixin 實現(xiàn) Serilizable

微信小程序支持es6嗎?談微信小程序開發(fā)!

微信小程序支持es6嗎?談微信小程序開發(fā)!

微信小程序支持es6嗎?談微信小程序開發(fā)!

上面的代碼,我們用 ES6 的類繼承實現(xiàn)了 Serializable,它檢查當前實例的類上是否有定義 stringify 和 parse 靜態(tài)方法,如果有,使用靜態(tài)方法重寫 toString 方法,如果沒有,則在實例化對象的時候拋出一個異常。然后通過 class Employ extends Serializable(Person) 來實現(xiàn)可序列化,在這里我們沒有可序列化 Person 本身,而將 Serializable 在語義上變成一種修飾,即 Employee 是一種可序列化的 Person。

使用weakmaps實現(xiàn)私有實例成員(Private instance members with weakmaps)

Weakmaps解決了私有數(shù)據(jù)成員的遺留問題。首先,再也沒有必自己生成一個唯一的ID了,因為該對象實例本身就是一個唯一ID。其次,當一個對象實例被垃圾回收,綁到該實例中的weakmap中所有數(shù)據(jù)也會被回收。

微信小程序支持es6嗎?談微信小程序開發(fā)!

privateData在這個例子中是一個WeakMap的實例 。當一個新的Shape被創(chuàng)建時,一個weakmap的條目會被創(chuàng)建用來以便該實例來保存包含私有數(shù)據(jù)的對象。在weakmap中最關(guān)鍵的是this ,即使對于開發(fā)者來說獲取一個Shape對象的引用是微不足道的一件事,他們也無法從實例外來訪問到privateData,所以,數(shù)據(jù)被從麻煩制造者手中安全保護了。任何想要操縱私有數(shù)據(jù)的方法只能夠通過傳入實例的this ,從而拿到返回的對象。在這個例子中, getName()會獲取對象并返回name屬性的值。

尾調(diào)用優(yōu)化(Tail-call optimization)

尾調(diào)用(Tail Call)是函數(shù)式編程的一個重要概念,是指某個函數(shù)的最后一步是調(diào)用另一個函數(shù)。

尾調(diào)用優(yōu)化是為了避免不斷保留和創(chuàng)建新的調(diào)用棧,而在函數(shù)最后一步調(diào)用另一個函數(shù)。最后一步的意義就在于:不需要保留當前函數(shù)的執(zhí)行環(huán)境,在調(diào)用的下一個函數(shù)執(zhí)行完畢并給出返回值后,直接再返回,類似于pipe。

函數(shù)調(diào)用自身,稱為遞歸。如果尾調(diào)用自身,就稱為尾遞歸。尾遞歸(Tail-recursion)就是利用尾調(diào)優(yōu)化的特性,從語言機制上進行遞歸操作的優(yōu)化,防止堆棧溢出(stack overflow)。

"尾調(diào)用優(yōu)化"對遞歸操作意義重大,所以一些函數(shù)式編程語言將其寫入了語言規(guī)格。ES6也是如此,第一次明確規(guī)定,所有 ECMAScript 的實現(xiàn),都必須部署"尾調(diào)用優(yōu)化"。這就是說,在 ES6 中,只要使用尾遞歸,就不會發(fā)生棧溢出,相對節(jié)省內(nèi)存。

遞歸非常耗費內(nèi)存,因為需要同時保存成千上百個調(diào)用幀,很容易發(fā)生“棧溢出”錯誤(stack overflow)。但對于尾遞歸來說,由于只存在一個調(diào)用幀,所以永遠不會發(fā)生“棧溢出”錯誤。

下面代碼是一個階乘函數(shù),計算n的階乘,最多需要保存n個調(diào)用記錄,復雜度 O(n)

微信小程序支持es6嗎?談微信小程序開發(fā)!

如果改成尾遞歸調(diào)用,只保留一個調(diào)用記錄,復雜度 O(1)

微信小程序支持es6嗎?談微信小程序開發(fā)!

計算fibonacci數(shù)列,能充分說明尾遞歸優(yōu)化的重要性

微信小程序支持es6嗎?談微信小程序開發(fā)!

使用尾遞歸優(yōu)化過的fibonacci 遞歸算法

微信小程序支持es6嗎?談微信小程序開發(fā)!

自定義錯誤類(Custom Errors)

Error是JavaScript中的錯誤類,它同時也是一個構(gòu)造函數(shù),可以用來創(chuàng)建一個錯誤對象。Error實例會在發(fā)生運行進錯誤時拋出,Error像其它對象一樣,也可以由用戶自定義創(chuàng)建。

ES6通過派生實現(xiàn)自定義錯誤類

微信小程序支持es6嗎?談微信小程序開發(fā)!

完整代碼

 

 


重磅推薦:小程序開店目錄

第一部分:小商店是什么

第二部分:如何開通一個小商店

第三部分:如何登錄小商店

第四部分:開店任務(wù)常見問題

第五部分:小商店可以賣什么

第六部分:HiShop小程序特色功能

第七部分:小程序直播

第八部分:小程序收貨/物流

第九部分:小程序怎么結(jié)算

第十部分:小程序客服

第十一部分:電商創(chuàng)業(yè)

第十二部分:小程序游戲開發(fā)

電話咨詢 微信咨詢 預約演示 0元開店