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呢? 小伙伴们好好思考一下,下篇文章我们继续讲解单例模式。

总结

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

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

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

相关推荐
小蜗牛慢慢爬行4 分钟前
有关异步场景的 10 大 Spring Boot 面试问题
java·开发语言·网络·spring boot·后端·spring·面试
m0_7482552615 分钟前
easyExcel导出大数据量EXCEL文件,前端实现进度条或者遮罩层
前端·excel
长风清留扬35 分钟前
小程序毕业设计-音乐播放器+源码(可播放)下载即用
javascript·小程序·毕业设计·课程设计·毕设·音乐播放器
web147862107231 小时前
C# .Net Web 路由相关配置
前端·c#·.net
m0_748247801 小时前
Flutter Intl包使用指南:实现国际化和本地化
前端·javascript·flutter
飞的肖1 小时前
前端使用 Element Plus架构vue3.0实现图片拖拉拽,后等比压缩,上传到Spring Boot后端
前端·spring boot·架构
青灯文案11 小时前
前端 HTTP 请求由 Nginx 反向代理和 API 网关到后端服务的流程
前端·nginx·http
ThisIsClark1 小时前
【后端面试总结】MySQL主从复制逻辑的技术介绍
mysql·面试·职场和发展
m0_748254881 小时前
DataX3.0+DataX-Web部署分布式可视化ETL系统
前端·分布式·etl
ZJ_.1 小时前
WPSJS:让 WPS 办公与 JavaScript 完美联动
开发语言·前端·javascript·vscode·ecmascript·wps