马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
单例模式就是保证类的实例只有一个,这就是它的作用,比如在前端中,创建全局唯一的对话框实例,记录日志信息全局唯一实例等等。
单例模式在前端的两种实现方式:
1.通过原型方法实现- const Singleton = function () {
- this.instance = null;
- };
- Singleton.getInstance = function (name) {
- if (!this.instance) {
- this.instance = new Singleton();
- }
- return this.instance;
- };
- const a = Singleton.getInstance();
- const b = Singleton.getInstance();
- console.log(a === b); // true
复制代码 2.通过静态方法实现- class SingleDog {
- static instance;
- show() {
- console.log('我是一个单例对象')
- }
- static getInstance() {
- // 判断是否已经new过1个实例
- if (!SingleDog.instance) {
- // 若这个唯一的实例不存在,那么先创建它
- SingleDog.instance = new SingleDog()
- }
- // 如果这个唯一的实例已经存在,则直接返回
- return SingleDog.instance
- }
- }
- const s3 = SingleDog.getInstance()
- const s4 = SingleDog.getInstance()
- console.log(s3 === s4); // true
复制代码 实际上,上面两种方法模仿的是Java语言中的单例实现方式,平常我们前端开发,基于ES6使用模块导入导出,也可以看作单例模式:- // 比如这是SingletonExample.js
- // 可以定义一些属性,方法等等,然后通过export导出,其他模块再分别导入
- const array_state = [];
- const methodTest = function() {
- console.log('这是测试方法')
- }
- export default {
- array_state, methodTest
- }
复制代码 单例模式的应用场景:
1.利用单例模式思想 来实现 登录框的 显示和隐藏- class LoginForm {
- constructor(){
- this.state = 'hide'
- }
-
- show(){
- if(this.state === 'show'){
- console.log('已经显示');
- return
- }
- this.state = 'show';
- console.log('登录框已显示')
- }
-
- hide(){
- if(this.state === 'hide'){
- console.log('已经隐藏');
- return
- }
- this.state = 'hide';
- console.log('登录框已隐藏')
- }
- }
- LoginForm.getInstance = (function(){
- let instance
- return function() {
- if(!instance){
- instance = new LoginForm();
- }
- return instance
- }
- })
复制代码 测试:- let login1 = LoginForm.getInstance();
- login1.show(); //打印:登录框显示成功
- let login2 = LoginForm.getInstance();
- login2.hide(); //打印:登录框隐藏成功
- console.log(login1 === login2)
复制代码 其他的应用场景例如,vuex,redux中的store都是单例模式实现的
关于单例模式的思考:
其实,在前端使用Vue,React等框架开发时,很难再去使用传统的单例模式,因为ES6的导入导出不仅写法优雅,而且编码使用都比传统的书写方式方便。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |