JavaScript 设计模式之原型模式

原型模式

一般模式

所谓原型,一般就类似将数据放置到原型上,通过原型继承模式来实现一个基类,然后用子类继承方式来实现

// 汽车基类
const Car = function (car,sale) {this.car = car;this.sale = sale;this.getName = function () {}this.getPrice = function () {console.log(`this car ${this.car} has price ${this. Sale}`)}
}// 奔驰汽车
const BenChiCar = function (car, sale) {Car.call(this, car, sale);this.getName = function () {console.log(`my car name is benChi-${this. Car}`)}
}// 宝马汽车
const BaoMaCar = function (car, sale) {Car.call(this, car, sale);this.getName = function () {console.log(`my car name is baoMa-${this. Car}`)}
}const m1 = new BaoMaCar('x1', '22w')m1.getName() // my car name is baoMa-x1
m1.getPrice() // this car x1 has price 22w

Car 将一些公用的属性或方法抽离出来,用 call 的方式进行调用

更优模式

上面的 Car 我们在使用每次使用的时候,其公用方法都会实例化一次,我们将一些耗资源的一些方法应该放置到 Car 的原型上

const Car = function (car,sale) {this.car = car;this.sale = sale;
}
car.prototype.getName = function () { // todo:
}
Car.prototype.getPrice = function () {console.log(`this car ${this.car} has price ${this.sale}`)
}const BenChiCar = function (car, sale) {Car.call(this, car, sale);this.getName = function () {console.log(`my car name is benChi-${this.car}`)}
}
BenChiCar.prototype = new Car
const BaoMaCar = function (car, sale) {Car.call(this, car, sale);this.getName = function () {console.log(`my car name is baoMa-${this.car}`)}
}
BaoMaCar.prototype = new Car
const m1 = new BaoMaCar('x1', '22w')m1.getName() // my car name is baoMa-x1
m1.getPrice() // this car x1 has price 22w

不过这也是有缺点的

缺点

这里我们是用的基类原型,那就是说我们在用到的基类原型对于其子类都是共享的数据,比如

const Car = function (car,sale) {this.car = car;this.sale = sale;
}
Car.prototype.getName = function () { // todo:console.log(`my car name is benChi-${this.car}`)
}
Car.prototype.getPrice = function () {console.log(`this car ${this.car} has price ${this.sale}`)
}const BenChiCar = function (car, sale) {Car.call(this, car, sale);
}
const BaoMaCar = function (car, sale) {Car.call(this, car, sale);
}
BaoMaCar.prototype = new Car
BenChiCar.prototype = new Car
const m1 = new BaoMaCar('x1', '22w')
const m2 = new BenChiCar('x5', '43w')m1.getName() // my car name is baoMa-x1
m2.getName() // my car name is benChi-x5
Car.prototype.getColor = function () {console.log("my color is white")
}
m1.getColor() // my color is white
m2.getColor() // my color is whitem1.getPrice() // this car x1 has price 22w

比如我们修改了基类 Car 的原型,所有的子类都会受到影响,所以在使用这种方式的时候是需要注意到这点

原型继承

我们可以写一个原型继承类来实现原型继承


const prototypeExtend = function () {let F = function () { },args = arguments,i = 0,len = args.lengthfor (; i < len; i++){for (let j in args[i]) {F.prototype[j] = args[i][j];}}return new F
}let demo = prototypeExtend({name: '梅剑',getAge() { return 22}
}, {getName() {return '李师师'}
}, {sayHi() {return 'Hello 狄镖头'}
})console.log(demo.name) // 梅剑
console.log(demo.getName()) // 李师师
console.log(demo.sayHi()) // Hello 狄镖头

这种我们就可以避免使用 new 关键字来实现原型继承了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/669611.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++ 内存模型

C内存模型 - MrYun - 博客园 (cnblogs.com) 内存区域 C内存分为5个区域&#xff1a;堆 heap &#xff1a; 由new分配的内存块&#xff0c;其释放编译器不去管&#xff0c;由我们程序自己控制&#xff08;一个new对应一个delete&#xff09;。如果程序员没有释放掉&#xff0c…

abap - 发送邮件,邮件正文带表格和excel附件

发送内容 的数据获取&#xff1a; 正文部分使用cl_document_bcs>create_document静态方法实现 传入参数为html内表结构 CLEAR lo_document .lo_document cl_document_bcs>create_document(i_type HTMi_text lt_htmli_length conlengthsi_subject lv_subje…

【漏洞复现】EPON上行A8-C政企网关信息泄露漏洞

Nx01 产品简介 EPON上行A8-C政企网关是一款终端产品&#xff0c;提供企业网络解决方案。 Nx02 漏洞描述 EPON上行A8-C政企网关敏感信息泄露漏洞&#xff0c;攻击者通过敏感信息泄露获取管理员密码。 Nx03 产品主页 fofa-query: "ZXECS" && title"Web…

网络安全红队基础建设与介绍

1.ATT&CK相关背景 ATT&CK在各种日常环境中都很有价值。开展任何防御活动时&#xff0c;可以应用ATT&CK防御法&#xff0c;参考攻击者及其行为。ATT&CK不仅对网络防御者提供通用技术库&#xff0c;还为渗透测试和红队提供了基础。提到对抗行为时&#xff0c;这为…

【机器学习】机器学习简单入门

&#x1f388;个人主页&#xff1a;甜美的江 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;matplotlib &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进…

谷歌免费开放模糊测试框架OSS-Fuzz(物联网、车联网、供应链安全、C/C++)

目录 模糊测试的智能化和自动化 模糊测试不能代替安全设计原则 AI驱动的漏洞修补

<.Net>使用visual Studio 2022在VB.net中新添自定义画图函数(优化版)

前言 这是基于我之前的一篇博文&#xff1a; 使用visual Studio 2019在VB.net中新添自定义画图函数 在此基础上&#xff0c;我优化了一下&#xff0c;改进了UI&#xff0c;添加了示例功能&#xff0c;即以画圆函数为基础&#xff0c;添加了走马灯功能。 先看一下最终效果&#…

Google Chrome Close AutoUpdate

DOMException: play() failed because the user didn‘t interact with the document first.-CSDN博客 html5 audio video-CSDN博客 Google Chrome Close AutoUpdate 关闭google浏览器自动更新 1&#xff1a;检查是否已安装google浏览器&#xff0c;并卸载&#xff1a; 2&…

router路由跳转的两种模板

<router-link><router-link/> <router-view><router-view/> link &#xff1a;链接&#xff0c;联系 view&#xff1a;指看见展现在人们面前的、可以稳定地进行详细审视的事物 将语境拉回到router里&#xff0c;抽象概括一下 router-link就是一个…

docker compose安装minio

要使docker-compose管理的容器&#xff08;如MinIO&#xff09;在系统启动时自动启动&#xff0c;你需要使用Docker的重启策略。在你的docker-compose.yml文件中为MinIO服务添加restart策略即可实现这一目标。restart: always指令确保了在容器退出时总是重新启动容器&#xff0…

55. 右旋字符串(卡码网KamaCoder)

文章目录 55. 右旋字符串题目描述暴力优化&#xff1a;不能申请额外空间&#xff0c;只能在本串上操作思路代码 55. 右旋字符串 题目描述 字符串的右旋转操作是把字符串尾部的若干个字符转移到字符串的前面。给定一个字符串 s 和一个正整数 k&#xff0c;请编写一个函数&…

Spark SQL调优实战

1、新添参数说明 // Driver和Executor内存和CPU资源相关配置 --是否开启executor动态分配&#xff0c;开启时spark.executor.instances不生效 spark.dynamicAllocation.enabledfalse --配置Driver内存 spark.dirver.memory5g --driver最大结果大小&#xff0c;设置为0代…

SQLserver2008 r2 下载安装配置、使用、新建登录用户及通过Navicat远程连接

目录 一、下载 二、安装配置 1.安装 2.许可条款 3.安装程序支持文件 4.功能选择 5.实例配置 6.服务器配置 7.数据库引擎配置 8.Reporting Services 配置 9.安装进度 ​编辑 10.完成 三、使用 四、新建登录用户 1.新建登录名 2.常规 3.服务器角色 4. 用户映…

08 - python操作mysql

认识pymysql 借助pymysql模块&#xff0c;这是一个python编写的MYSQL驱动程序&#xff0c;借助它来操作数据库。 操作数据库的流程和java 使用原生的JDBC操作数据的流程步骤差不多。 安装pymysql pip install pymysql 操作步骤 导入pymysql模块 import pymysql创建数据库…

基于CNN+LSTM深度学习网络的时间序列预测matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 卷积神经网络&#xff08;CNN&#xff09; 4.2 长短时记忆网络&#xff08;LSTM&#xff09; 4.3 CNNLSTM网络结构 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 MA…

Java设计模式大全:23种常见的设计模式详解(一)

本系列文章简介&#xff1a; 设计模式是在软件开发过程中&#xff0c;经过实践和总结得到的一套解决特定问题的可复用的模板。它是一种在特定情境中经过验证的经验和技巧的集合&#xff0c;可以帮助开发人员设计出高效、可维护、可扩展和可复用的软件系统。设计模式提供了一种在…

将程序做成系统服务 shell脚本

要将程序做成系统服务&#xff0c;你可以使用Shell脚本来创建一个systemd服务单元文件。下面是一个示例的Shell脚本&#xff0c;用于创建一个名为my_service的服务单元文件&#xff1a; #!/bin/bash# 定义服务的名称和描述 SERVICE_NAME"my_service" DESCRIPTION&quo…

【手写数据库toadb】toadb表数据文件存储结构,创建表与插入数据在物理文件层的流程,行列混合存储新增分组文件结构介绍

12 数据库表物理存储结构 ​专栏内容: 手写数据库toadb 本专栏主要介绍如何从零开发,开发的步骤,以及开发过程中的涉及的原理,遇到的问题等,让大家能跟上并且可以一起开发,让每个需要的人成为参与者。 本专栏会定期更新,对应的代码也会定期更新,每个阶段的代码会打上ta…

二进制可执行文件的常见后缀

有关二进制程序 二进制程序是一种由机器代码【机器代码是一种由计算机硬件理解和执行的低级指令集】组成的程序&#xff0c;它由计算机直接执行。二进制程序通常是由高级编程语言编译而来&#xff0c;经过编译器的处理将高级代码转换为机器代码。在不同的操作系统上&#xff0…

【Mysql】基本语法(数据操作+表结构操作)

一&#xff1a;数据操作 1.数据库&#xff08;库名&#xff09; create database 数据库名 //创建数据库 use 数据库名 //选择数据库 drop database 数据库名 //删除数据库[rootxibushuma ~]# mysql db2 -e show tables 不登录mysql 情况下&…