JS:单例模式 —— 百度考题 (一)

前言

今天我们来聊聊单例模式,在我们以往的文章中,我们讲过了代理模式,代理模式和单例模式都是设计模式的一种,感兴趣的小伙伴们可以先看看我的上篇文章,链接在此: 代理模式

设计模式是在软件设计中经常出现的一些问题的通用、可重用的解决方案。它们是经验丰富的开发人员为了解决特定类型的问题而提出的经过验证的设计思路。设计模式并不是一种可以直接的转化为代码的具体算法,而是描述问题和解决方案之间关系的抽象模型。

设计模式的主要目标是提供一种通用的、可重复使用的解决方案,帮助开发人员解决软件设计中常见的问题,提高代码的可维护性、可执行性和可扩展性。使用设计模式有助益于降低系统耦合度,使得代码更容易理解和维护。

单例模式

单例模式是一种设计模式,其目的是保证一个类只有一个实例,并提供一个全局访问点。这样可以防止重复实例化相同的对象,从而节省系统资源并保证一致性。

单例模式中提到了类,那么许多学习JavaScript不久的小伙伴们就懵了。什么?JS中还有类吗? 那么既然提到了类,我们就先来讲讲这个类吧

没错,在ES6出来之前,JavaScript中确实是没有类这个概念的。在JavaScript的类(class)出现之前,开发者主要使用构造函数之前和原型链的方式来实现面向对象编程。我们举个例子来看看:

  1. 构造函数: 构造函数是一种创建对象的特殊函数。通过new关键字调用构造函数可以创建对象,构造函数中的this关键字指向新创建的对象。
js 复制代码
function Animal(name) {
    this.name = name;

    this.makeSound = function() {
        console.log("Some generic sound");
    };
}

const myAnimal = new Animal("Dog");
myAnimal.makeSound();
  1. 原型链继承: 对象通过原型链与其他对象连接在一起。在这种模式下,通过prototype属性定义方法构造函数,然后通过实例化__proto__

关于构造函数和原型在我之前的文章都有讲过,不太懂这些或者感兴趣的小伙伴可以翻阅看看,相信一定会对你们有帮助或者启发。

JavaScript有对象字面量和原型链可以用,为什么要引入类?

在JavaScript之后引入类(类),是为了提供一种更容易观察、更容易理解、更容易使用的面向对象编程的语法。在引入类之前,JavaScript使用原型链和构造函数来实现面向对象编程,这这种方式可能对初学者或来自其他对象的语言的开发者来说缺乏洞察力,语法也相对复杂。

引入类的主要目的包括:

  1. 更易理解的语法: 类提供了一种更接近传统针对对象语言的语法,如Java或C++。这种语言语法更容易理解,有助于降低学习成本,特别是对于那些已经熟悉其他对象的开发者说。
  2. 更容易使用的继承: 类引入了更简单和一致的继承模型。通过extends关键字实现继承,由此可知之前的继承链更容易理解。
  3. 更清晰的构造函数和方法定义: 类的构造函数和方法定义更清晰,不再需要显着的公式定义原型。这使得代码更容易阅读,简化了语音的代码。
  4. 更好的封装: 类提供了更好的封装性,使得数据和行为可以更轻松地组织在一起。通过constructormethod的定义,可以更清晰地看到类的结构。
  5. 更方便的静态方法: 引入了static关键字,可以更方便地定义静态方法,这些方法可以直接通过类调用,而无需创建类的实例。

说了这么多类的概念,让我们来看看什么是类,而类跟构造函数有什么区别:

js 复制代码
class Person {
    // 构造函数
    constructor(name, age) {
        // 在构造函数中使用 this 存储属性
        this.name = name;
        this.age = age;
    }

    // 方法
    sayHello() {
        console.log(`Hello, my name is ${this.name} and I'm ${this.age} years old.`);
    }
}

// 创建类的实例
const person1 = new Person("Alice", 25);
const person2 = new Person("Bob", 30);

// 调用方法
person1.sayHello(); // 输出: Hello, my name is Alice and I'm 25 years old.
person2.sayHello(); // 输出: Hello, my name is Bob and I'm 30 years old.

类是一种抽象的概念,它提供了一种通用的模型,而对象是类的具体实例,具体体现了类的属性和行为。

给大家看一道题,来引出我们今天的主题单例模式:

js 复制代码
class SingleDog{
    show() {
        console.log("我是一个单例对象");
    }
}

const s1 = new SingleDog()
const s2 = new SingleDog()

console.log(s1 === s2);

最后输出 true or false呢? 小伙伴们好好思考一下,下篇文章我们继续讲解单例模式。

总结

  • 类是一种抽象的概念,它提供了一种通用的模型,而对象是类的具体实例,具体体现了类的属性和行为。

  • 单例模式是一种设计模式,其目的是保证一个类只有一个实例,并提供一个全局访问点。这样可以防止重复实例化相同的对象,从而节省系统资源并保证一致性。

今天的内容就到这啦,如果你觉得小编写的还不错的话,或者对你有所启发,请给小编一个辛苦的赞吧

相关推荐
小曲曲15 分钟前
接口上传视频和oss直传视频到阿里云组件
javascript·阿里云·音视频
学不会•1 小时前
css数据不固定情况下,循环加不同背景颜色
前端·javascript·html
EasyNTS2 小时前
H.264/H.265播放器EasyPlayer.js视频流媒体播放器关于websocket1006的异常断连
javascript·h.265·h.264
活宝小娜4 小时前
vue不刷新浏览器更新页面的方法
前端·javascript·vue.js
程序视点4 小时前
【Vue3新工具】Pinia.js:提升开发效率,更轻量、更高效的状态管理方案!
前端·javascript·vue.js·typescript·vue·ecmascript
coldriversnow4 小时前
在Vue中,vue document.onkeydown 无效
前端·javascript·vue.js
我开心就好o4 小时前
uniapp点左上角返回键, 重复来回跳转的问题 解决方案
前端·javascript·uni-app
开心工作室_kaic5 小时前
ssm161基于web的资源共享平台的共享与开发+jsp(论文+源码)_kaic
java·开发语言·前端
刚刚好ā5 小时前
js作用域超全介绍--全局作用域、局部作用、块级作用域
前端·javascript·vue.js·vue
沉默璇年6 小时前
react中useMemo的使用场景
前端·react.js·前端框架