微信小程序支持es6嗎?談微信小程序開(kāi)發(fā)!
微信小程序支持es6嗎已經(jīng)是當(dāng)下微信小程序開(kāi)發(fā)最熱門(mén)的話(huà)題,下面將從多方面來(lái)談?wù)勎⑿判〕绦蛑С謊s6及相關(guān)的設(shè)置相關(guān)的內(nèi)容。
可子類(lèi)化的內(nèi)建對(duì)象(Subclassable Built-ins)
在ES6中,像Array,Date和Dom元素這樣的內(nèi)建對(duì)象都可以被子類(lèi)化。
通過(guò)子類(lèi)工廠實(shí)現(xiàn)簡(jiǎn)單的合成器(Simple mixins via subclass factories)
mixin在javascript里可以看作是一種從別的對(duì)象"借用"功能的方法。每一個(gè)新定義的對(duì)象都有一個(gè) prototype屬性,其他的對(duì)象就可以從這里"借用"功能。這里的功能可以是一個(gè)屬性,也可以是一個(gè)方法。
Mixin支持在一個(gè)系統(tǒng)中降解功能的重復(fù)性,增加功能的重用性。在一些應(yīng)用程序也許需要在所有的對(duì)象實(shí)體共享行為的地方,我們能夠通過(guò)在一個(gè)Mixin中維護(hù)這個(gè)共享的功能,來(lái)很容易的避免任何重復(fù),而因此專(zhuān)注于只實(shí)現(xiàn)我們系統(tǒng)中真正彼此不同的功能。
在 ES6 中,我們可以采用全新的基于類(lèi)繼承的 “mixin” 模式設(shè)計(jì)更優(yōu)雅的“語(yǔ)義化”接口,這是因?yàn)?ES6 中的 extends 可以繼承動(dòng)態(tài)構(gòu)造的類(lèi),這一點(diǎn)和其他的靜態(tài)聲明類(lèi)的編程語(yǔ)言不同。當(dāng) ES6 類(lèi)繼承另一個(gè)類(lèi),被繼承的類(lèi)可以是通過(guò)任意表達(dá)式創(chuàng)建的動(dòng)態(tài)類(lèi)。這個(gè)特性可以允許實(shí)現(xiàn)一種合成器模式,用一個(gè)函數(shù)來(lái)將一個(gè)類(lèi) C 映射到一個(gè)新的繼承了C的類(lèi)。
mixin 式繼承的基本形式:
用 mixin 實(shí)現(xiàn) Serilizable
上面的代碼,我們用 ES6 的類(lèi)繼承實(shí)現(xiàn)了 Serializable,它檢查當(dāng)前實(shí)例的類(lèi)上是否有定義 stringify 和 parse 靜態(tài)方法,如果有,使用靜態(tài)方法重寫(xiě) toString 方法,如果沒(méi)有,則在實(shí)例化對(duì)象的時(shí)候拋出一個(gè)異常。然后通過(guò) class Employ extends Serializable(Person) 來(lái)實(shí)現(xiàn)可序列化,在這里我們沒(méi)有可序列化 Person 本身,而將 Serializable 在語(yǔ)義上變成一種修飾,即 Employee 是一種可序列化的 Person。
使用weakmaps實(shí)現(xiàn)私有實(shí)例成員(Private instance members with weakmaps)
Weakmaps解決了私有數(shù)據(jù)成員的遺留問(wèn)題。首先,再也沒(méi)有必自己生成一個(gè)唯一的ID了,因?yàn)樵搶?duì)象實(shí)例本身就是一個(gè)唯一ID。其次,當(dāng)一個(gè)對(duì)象實(shí)例被垃圾回收,綁到該實(shí)例中的weakmap中所有數(shù)據(jù)也會(huì)被回收。
privateData在這個(gè)例子中是一個(gè)WeakMap的實(shí)例 。當(dāng)一個(gè)新的Shape被創(chuàng)建時(shí),一個(gè)weakmap的條目會(huì)被創(chuàng)建用來(lái)以便該實(shí)例來(lái)保存包含私有數(shù)據(jù)的對(duì)象。在weakmap中最關(guān)鍵的是this ,即使對(duì)于開(kāi)發(fā)者來(lái)說(shuō)獲取一個(gè)Shape對(duì)象的引用是微不足道的一件事,他們也無(wú)法從實(shí)例外來(lái)訪問(wèn)到privateData,所以,數(shù)據(jù)被從麻煩制造者手中安全保護(hù)了。任何想要操縱私有數(shù)據(jù)的方法只能夠通過(guò)傳入實(shí)例的this ,從而拿到返回的對(duì)象。在這個(gè)例子中, getName()會(huì)獲取對(duì)象并返回name屬性的值。
尾調(diào)用優(yōu)化(Tail-call optimization)
尾調(diào)用(Tail Call)是函數(shù)式編程的一個(gè)重要概念,是指某個(gè)函數(shù)的最后一步是調(diào)用另一個(gè)函數(shù)。
尾調(diào)用優(yōu)化是為了避免不斷保留和創(chuàng)建新的調(diào)用棧,而在函數(shù)最后一步調(diào)用另一個(gè)函數(shù)。最后一步的意義就在于:不需要保留當(dāng)前函數(shù)的執(zhí)行環(huán)境,在調(diào)用的下一個(gè)函數(shù)執(zhí)行完畢并給出返回值后,直接再返回,類(lèi)似于pipe。
函數(shù)調(diào)用自身,稱(chēng)為遞歸。如果尾調(diào)用自身,就稱(chēng)為尾遞歸。尾遞歸(Tail-recursion)就是利用尾調(diào)優(yōu)化的特性,從語(yǔ)言機(jī)制上進(jìn)行遞歸操作的優(yōu)化,防止堆棧溢出(stack overflow)。
"尾調(diào)用優(yōu)化"對(duì)遞歸操作意義重大,所以一些函數(shù)式編程語(yǔ)言將其寫(xiě)入了語(yǔ)言規(guī)格。ES6也是如此,第一次明確規(guī)定,所有 ECMAScript 的實(shí)現(xiàn),都必須部署"尾調(diào)用優(yōu)化"。這就是說(shuō),在 ES6 中,只要使用尾遞歸,就不會(huì)發(fā)生棧溢出,相對(duì)節(jié)省內(nèi)存。
遞歸非常耗費(fèi)內(nèi)存,因?yàn)樾枰瑫r(shí)保存成千上百個(gè)調(diào)用幀,很容易發(fā)生“棧溢出”錯(cuò)誤(stack overflow)。但對(duì)于尾遞歸來(lái)說(shuō),由于只存在一個(gè)調(diào)用幀,所以永遠(yuǎn)不會(huì)發(fā)生“棧溢出”錯(cuò)誤。
下面代碼是一個(gè)階乘函數(shù),計(jì)算n的階乘,最多需要保存n個(gè)調(diào)用記錄,復(fù)雜度 O(n)
如果改成尾遞歸調(diào)用,只保留一個(gè)調(diào)用記錄,復(fù)雜度 O(1)
計(jì)算fibonacci數(shù)列,能充分說(shuō)明尾遞歸優(yōu)化的重要性
使用尾遞歸優(yōu)化過(guò)的fibonacci 遞歸算法
自定義錯(cuò)誤類(lèi)(Custom Errors)
Error是JavaScript中的錯(cuò)誤類(lèi),它同時(shí)也是一個(gè)構(gòu)造函數(shù),可以用來(lái)創(chuàng)建一個(gè)錯(cuò)誤對(duì)象。Error實(shí)例會(huì)在發(fā)生運(yùn)行進(jìn)錯(cuò)誤時(shí)拋出,Error像其它對(duì)象一樣,也可以由用戶(hù)自定義創(chuàng)建。
ES6通過(guò)派生實(shí)現(xiàn)自定義錯(cuò)誤類(lèi)
完整代碼
-
微信小程序商城系統(tǒng)開(kāi)發(fā)其實(shí)很簡(jiǎn)單
微信小程序商城系統(tǒng)開(kāi)發(fā)其實(shí)很簡(jiǎn)單,只需要五步就可以完成,整個(gè)過(guò)程包括開(kāi)發(fā)、上線、發(fā)布都可以輕松搞定...詳情
第二部分:如何開(kāi)通一個(gè)小商店