当前位置: 首页 > news >正文

【前端知识】JavaScript——设计模式(工厂模式、构造函数模式、原型模式)

【前端知识】JavaScript——设计模式(工厂模式、构造函数模式、原型模式)

一、工厂模式

工厂模式是一种众所周知的设计模式,广泛应用于软件工程领域,用于抽象创建特定对象的过程。

优点:可以解决创建多个类似对象的问题

缺点:没有解决对象标识问题(即新创建的对象是什么类型)

示例:

function createPerson(name, age, job) { // 创建对象,将值赋值给该对象后,返回let o = new Object(); o.name = name; o.age = age; o.job = job; o.sayName = function() { console.log(this.name); }; // 返回对象return o; 
} 
let person1 = createPerson("Nicholas", 29, "Software Engineer"); 
let person2 = createPerson("Greg", 27, "Doctor");

二、构造函数模式

构造函数模式与工厂模式相比,没有显式地创建对象,其属性和方法直接赋值给了 this,且没有 return。

优点:定义自定义构造函数可以确保实例被标识为特定类型

缺点:其定义的方法会在每个实例上都创建一遍

示例:

// 区别1: 函数名大写,为了与普通函数区分
function Person(name, age, job){ // 区别2: 与工厂模式不同,传入的参数赋值给thisthis.name = name; this.age = age; this.job = job; this.sayName = function() { console.log(this.name); }; //  区别3: 无需返回对象
} 
// 区别4: 通过new操作符,创建Person实例
let person1 = new Person("Nicholas", 29, "Software Engineer"); 
let person2 = new Person("Greg", 27, "Doctor"); 
person1.sayName(); // Nicholas 
person2.sayName(); // Greg

注意:使用 new 操作符调用构造函数的执行过程:

步骤过程
1在内存中创建一个新对象。
2这个新对象内部的[[Prototype]]特性被赋值为构造函数的 prototype 属性。
3构造函数内部的 this 被赋值为这个新对象(即 this 指向新对象)。
4执行构造函数内部的代码(给新对象添加属性)。
5如果构造函数返回非空对象,则返回该对象;否则,返回刚创建的新对象。

三、原型模式

每个函数都会创建一个 prototype 属性,这个属性是一个对象,包含应该由特定引用类型的实例共享的属性和方法。

优点:在它上面定义的属性和方法可以被对象实例共享

缺点:所有实例在默认情况先都将取得相同的属性值

示例:

function Person() {} 
Person.prototype.name = "Nicholas"; 
Person.prototype.age = 29; 
Person.prototype.job = "Software Engineer"; 
Person.prototype.sayName = function() { console.log(this.name); 
}; 
let person1 = new Person(); 
person1.sayName(); // "Nicholas" 
let person2 = new Person(); 
person2.sayName(); // "Nicholas" 
console.log(person1.sayName == person2.sayName); // true
http://www.lryc.cn/news/99087.html

相关文章:

  • 未来的算法备案法规:创新和安全如何兼顾?
  • pycharm 使用远程服务器 jupyter (本地jupyter同理)
  • leetcode 376. 摆动序列
  • 【图像处理】使用自动编码器进行图像降噪(改进版)
  • MySQL大数据量分页查询方法及其优化
  • dataTable转成对象、json、list
  • ubuntu环境安装centos7虚拟机网络主机不可达,ping不通
  • STN:Spatial Transformer Networks
  • C语言学习笔记 VScode设置C环境-06
  • alias取别名后,另一个shell中和shell脚本中不生效的问题以及crontab执行docker失败问题
  • Shell ❀ 一键配置Iptables规则脚本 (HW推荐)
  • linux服务器查找大文件及删除文件后磁盘空间没有得到释放
  • Java那些“锁”事 - 死锁及排查
  • LLM系列 | 18 : 如何用LangChain进行网页问答
  • Aspose.cell excel转pdf日期格式不正确yyyy/MM/dd变成MM/dd/yyyy
  • 搭建golang开发环境
  • Django实现音乐网站 ⑴
  • 基于粒子群优化算法的分布式电源选址与定容【多目标优化】【IEEE33节点】(Matlab代码实现)
  • 打卡一个力扣题目
  • 【SSM—SpringMVC】 问题集锦(持续更新)
  • 2022年全国职业院校技能大赛(高职组)“软件测试”赛项接口测试任务书
  • Docker 如何助您成为数据科学家
  • 机器学习01 -Hello World(对鸢尾花(Iris Flower)进行训练及测试)
  • android studio JNI开发
  • CSS 高频按钮样式
  • 系列二、RocketMQ简介
  • 论文笔记--Skip-Thought Vectors
  • 1400*B. Karen and Coffee
  • 【业务功能篇54】Springboot项目常用工具类:HTTP状态码/客户端request
  • Fine Logic