前言
最近在回顾设计模式方式的知识,重新翻阅了《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(