博客
电影
宝箱
友链
关于
<
社保与个人所得税的小知识
ES6设计模式之工厂模式
>
ES6设计模式之单例模式
作者:
Cifer
类别: 技术·JS
时间:2018-02-26 01:32:28
字数:1491
版权所有,未经允许,请勿转载,谢谢合作~
附: [ES6设计模式之工厂模式](http://www.boatsky.com/blog/22.html "ES6设计模式之工厂模式") [ES6设计模式之观察者模式](http://www.boatsky.com/blog/40.html "ES6设计模式之观察者模式") #### 单例模式 Singleton 每次new一个类,都会得到一个新的实例,可有些场景,希望使用单实例,比如全局共用的缓存,我们一般会设一个全局变量,把缓存赋值给该变量,如果使用设计模式我们会这样写: ```javascript //缓存 let Cache = (function(){ let cacheInstance; let getInstance = function(singletonInstance){ if (singletonInstance) { cacheInstance = singletonInstance; } return cacheInstance; } return getInstance; }()); //单例 class Singleton { constructor() { let singleton = Cache(); if (!singleton) { Cache(this); } return singleton; } } ``` 测试 ```javascript let cache = new Singleton(); let cache2 = new Singleton(); cache.name = 'boatsky'; //boatsky console.log(cache2.name); //true console.log(cache === cache2); ``` 这里[西法](http://www.boatsky.com "太空船博客" rel="nofollow")为什么不在Singleton写一个获取实现的方法? 防止使用者依然使用new 为什么不用全局变量? 如果有些数据比较大,又只有少数用户用到,则无数全局使用,仅当调用时使用 #### 获取斐波那契数列第n位的值 斐波那契数列是指数列第0位与第1位是1,从第2位开始,每一位都等于前两位之和。如果要知道n位的数值,最简单的实现就是递归了,比如 ```javascript function Fibonacci(n) { if (n == 0 || n == 1) { return 1; } return Fibonacci(n -1) + Fibonacci(n - 2);; } ``` 递归的缺点太明显了,函数调用是有调用帧的概念,每次调用要等上栈的调用结果返回,因此上述方法,即便是计算45位的数值,在本电脑上测试需13s,如果把数字设为1042,本电脑约要1.07e+301 s才能计算出结果,宇宙的年龄约是4.36e+17 s,还要等待2.45e+283个宇宙年龄呢~(微笑脸) 所以使用上述的缓存解决这个问题: ```javascript function Fibonacci(n) { if (n == 0 || n == 1) { if (!cache[n]) { cache[n] = 1; } } else { if(!cache[n]) { cache[n] = Fibonacci(n -1) + Fibonacci(n - 2); } } return cache[n]; } ``` 经测试计算1450也是1毫秒之内的事,再如1500,则数值超出JS最大值了
如果觉得有帮忙,您可以在本页底部留言。
相关推荐:
NPM发包流程与技巧
Puppeteer爬取豆瓣电影TOP250评分
基于vue实现腾讯云点播的上传与播放
JS代理Proxy与反射Reflect场景
轻应用PWA实践全过程
ES6迭代器Iterator原理与性能
JavaScript之Set与Map
ES6设计模式之观察者模式
解决toFixed四舍五入陷阱
深入理解IEEE754的64位双精度
ES6设计模式之工厂模式
ES6二叉树的实现
JavaScript链表实例
JavaScript排序算法及性能比较
原生ajax及jQuery封装ajax实例
JavaScript类的语法糖
……
更多
<
社保与个人所得税的小知识
ES6设计模式之工厂模式
>
全部留言
我要留言
内容:
网名:
邮箱:
个人网站:
发表
全部留言