前言
最近在回顧設計模式方式的知識,重新翻閱了《JavaScript模式》(個人感覺也算是一本小有名氣的書了哈)一書,讀時總有感觸:在即將到來的ES6的大潮下,書中的許多模式的代碼可用ES6的語法更為優雅簡潔的實現,而另一些模式,則已經被ES6原生支持,如模塊模式(99頁)。所以自己動手用ES6重新實現了一遍里面的設計模式,算是對其的鞏固,也算是與大家一起來研究探討ES6語法的一些最佳實踐。
目錄
(以下所有例子的原型均為《JavaScript模式》一書里“設計模式”章節中的示例)
代碼repo地址,歡迎star,歡迎follow。
實現
單例模式
主要改變為使用了class的寫法,使對象原型的寫法更為清晰,更整潔:
'use strict'; let __instance = (function () { let instance; return (newInstance) => { if (newInstance) instance = newInstance; return instance; } }()); class Universe { constructor() { if (__instance()) return __instance(); //按自己需求實例化 this.foo = 'bar'; __instance(this); } } let u1 = new Universe(); let u2 = new Universe(); console.log(u1.foo); //'bar' console.log(u1 === u2); //true
迭代器模式
ES6原生提供的Iterator接口就是為這而生的啊,使用胖箭頭函數寫匿名函數(還順帶綁定了上下文,舒舒服服):
'use strict'; let agg = { data: [1, 2, 3, 4, 5], [Symbol.iterator](){ let index = 0; return { next: () => { if (index < this.data.length) return {value: this.data[index++], done: false}; return {value: undefined, done: true}; }, hasNext: () => index < this.data.length, rewind: () => index = 0, current: () => { index -= 1; if (index < this.data.length) return {value: this.data[index++], done: false}; return {value: undefined, done: true}; } } } }; let iter = agg[Symbol.iterator](); console.log(iter.next()); // { value: 1, done: false } console.log(iter.next()); // { value: 2, done: false } console.log(iter.current());// { value: 2, done: false } console.log(iter.hasNext());// true console.log(iter.rewind()); // rewind! console.log(iter