javascript 设计模式 ( 读书笔记 )

javascript 设计模式

电子书链接@ 余杭子曰

用对象收编变量,防止变量覆盖和变量污染

let checkObject = {checkEmail: function () {console.log("邮箱校验");},checkPhone: function () {console.log("手机号校验");},checkPasswork: function () {console.log("密码校验");},
};checkObject.checkEmail();
// 缺点,别人如果想要调用该方法可能会影响原来的代码let copyObject = checkObject;
copyObject.checkEmail();

对象的另一种形式 函数

let checkObjectFn = function () {};
checkObjectFn.checkEmail = function () {console.log("邮箱校验");
};
checkObjectFn.checkPhone = function () {console.log("手机校验");
};
checkObjectFn.checkPasswork = function () {console.log("密码校验");
};// 调用
checkObjectFn.checkEmail();

真假对象

可以使用函数 返回一个对象,这样每次声明的时候都会生成一个 新对象,不会影响之前的对象方法

function checkObjectFn() {return {checkEmail: function () {console.log("邮箱校验");},checkPhone: function () {console.log("手机号校验");},checkPasswork: function () {console.log("密码校验");},};
}// 调用checkObjectFn().checkEmail();

类也可以

函数也可以写成类的形式
下面写法缺点: 每次示例对象时,都会复制一边 this 上的属性和方法. 会造成不必要的性能浪费.

function checkObjectFn() {this.checkEmail = function () {console.log("邮箱检验");};this.checkPhone = function () {console.log("手机检验");};this.checkPassword = function () {console.log("密码检验");};
}let a = new checkObjectFn();
a.checkEmail();

检测类

可以将公共方法同意挂载在 原型对象上. 这样示例对象就可以通过 __proto__ 一直找,直到找到为止

let CheckObjectFn = function () {};
CheckObjectFn.prototype.checkEmail = function () {console.log("邮箱验证");
};CheckObjectFn.prototype.checkPhone = function () {console.log("手机验证");
};CheckObjectFn.prototype.checkPassword = function () {console.log("密码验证");
};let a = new CheckObjectFn();
a.checkEmail();// 简化写法
let CheckObjectFn = function () {};
CheckObjectFn.prototype = {checkEmail: function () {console.log("邮箱验证");},checkPhone: function () {console.log("手机验证");},checkPassword: function () {console.log("密码验证");},
};let a = new CheckObjectFn();
a.checkEmail();
a.checkPhone();
a.checkPassword();

注意 :这两种 书写方式不能混合使用,要不可能出现方法覆盖,方法找不到的情况

链式调用

链式调用时 只需要在函数调用的同时,将当前 this返回出去即可

let CheckObjectFn = function () {};
CheckObjectFn.prototype = {checkEmail: function () {console.log("邮箱验证");return this;},checkPhone: function () {console.log("手机验证");return this;},checkPassword: function () {console.log("密码验证");return this;},
};let a = new CheckObjectFn();a.checkEmail().checkPassword().checkPhone();

函数高级用法

我们可以在不声明变量的情况下,直接在 Function 函数的原型对象上面挂方法

Function.prototype.checkEmail = function () {console.log("邮箱验证");
};Function.prototype.checkPhone = function () {console.log("手机验证");
};Function.prototype.checkPassword = function () {console.log("密码验证");
};let a = function () {};
a.checkEmail();

注意:虽然 javascript 支持上面写法,但是为了代码的可维护性 最好不要这样书写代码.可以使用下述代码替代

Function.prototype.addMethods = function (funcname, fn) {this[funcname] = fn;
};let a = function () {}; // 等同于 let a  = new Function()
a.addMethods("checkEmail", function () {console.log("邮箱验证");
});a.addMethods("checkPhone", function () {console.log("手机验证");
});
a.addMethods("checkPassword", function () {console.log("密码验证");
});a.checkEmail();
a.checkPhone();
a.checkPassword();// 链式调用
a.addMethods("checkEmail", function () {console.log("邮箱验证");return this;
});a.addMethods("checkPhone", function () {console.log("手机验证");return this;
});
a.addMethods("checkPassword", function () {console.log("密码验证");return this;
});
a.checkEmail().checkPhone().checkPassword();

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

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

相关文章

【Linux】psplash制作Linux开机动画

1. 下载psplash软件 下载psplash源码到ubuntu中: 下载地址:https://git.yoctoproject.org/psplash/commit/安装依赖环境 sudo apt-get install libgdk-pixbuf2.0-dev2. 准备图片 开机动画静态图片:psplash-poky.png开机动画进度条图片&…

哪些车企AEB标配率「不及格」

对于汽车智能化来说,基础安全不分高低配。但实际情况,却是另一番景象。 在全球范围,目前不少国家及地区的监管机构正在考虑将AEB(紧急制动系统)作为乘用车的标配纳入法规,“这是道路安全向前迈出了重要的一…

2023年9月青少年机器人技术(三级)等级考试试卷-理论综合

2023年9月青少年机器人技术等级考试(三级)理论综合试卷 单选题 第 1 题 单选题 Arduino Nano主控板,通过光敏电阻控制LED灯亮度的变化。电路搭设及程序如下图所示,当光照强度逐渐增强时,LED的亮度逐渐减弱&#xff…

CentOS 7设置固定IP地址

当我们安装了一个虚拟机或者装了一个系统的时候,经常会遇到需要设置固定ip的情况,本文就以Centos 7为例,讲述如何修改固定IP地址。 1、用ifconfig命令查看使用的网卡 如上图所示,我们就会看到我们目前使用的网卡名称 2、编辑网卡…

Systemd服务内存占用高的处理

参考文章 ### https://blog.csdn.net/weixin_44821644/article/details/121095406## https://blog.csdn.net/c123m/article/details/124301104 现象 检查 操作系统是4C8G,systemd的内存使用率比较高。操作系统日志没看到异常。很多服务通过systemd托管 ## 检查有…

(三)(Driver)驱动开发之双机调试环境搭建及内核驱动的运行

文章目录 1. 驱动开发环境搭建2. 驱动开发新建项目及项目属性配置和编译3. 双机调试环境搭建3.1 安装虚拟机VMware3.2 配置Dbgview.exe工具3.3 基于Windbg的双机调试 4. 内核驱动的运行4.1 临时关闭系统驱动签名校验4.2 加载驱动 1. 驱动开发环境搭建 请参考另一篇:https://bl…

Oracle11gr2 + plsql 配置

一、在Oracle中使用cmd窗口进行imp导入文件时,有时会报错IMP-00000: 未成功终止导入。将cmd窗口使用管理员运行,在进行imp导入文件时,又会报imp不是内部或外部命令,也不是可运行的程序。针对这种问题,是环境变量没配置好的原因 1…

7. Cesium中的Primitive

1. Primitive 介绍 在 Cesium 中,Primitive 是一种基本的图元,用于呈现 3D 场景中的几何形状、材质和其他属性。 Primitive 由两个部分组成,一个是几何形状(Geometry),用于定义 Primitive 的结构&#xf…

Guava-RateLimiter详解

简介: 常用的限流算法有漏桶算法和令牌桶算法,guava的RateLimiter使用的是令牌桶算法,也就是以固定的频率向桶中放入令牌,例如一秒钟10枚令牌,实际业务在每次响应请求之前都从桶中获取令牌,只有取到令牌的请…

Unity Spine 指定导入新Spine动画的默认材质

指定导入新Spine动画的默认材质 找到Spine的Editor导入配置如何修改方法一: 你可以通过脚本 去修改Assets/Editor/SpineSettings.asset文件方法二:通过面板手动设置 找到Spine的Editor导入配置 通常在 Assets/Editor/SpineSettings.asset 配置文件对应着 Edit/Prefe…

k8s简介以及各个组件

Kubernetes 概述 1、K8S 是什么? K8S 的全称为 Kubernetes (K12345678S),PS:“嘛,写全称也太累了吧,不如整个缩写”。 作用: 用于自动部署、扩展和管理“容器化(containerized)应用…

wxPython 布局调试技巧

在Show()与MainLoop()直接加入以上代码 import wx.lib.inspection ...frame.Show() wx.lib.inspection.InspectionTool().Show() app.MainLoop()启动后会弹出布局查看工具

蓝桥杯每日一题2032.10.24

蓝桥杯大赛历届真题 - C 语言 B 组 - 蓝桥云课 (lanqiao.cn) 题目描述 题目分析 由于布局为两个字节为一行&#xff0c;那我们输入两个数就为一行&#xff0c;但是这两个数全部得用二进制进行表示使用bitset bitset:将一个数转化为二进制 bitset<8>:将一个数转化为8位…

【Unity3D】Unity与Android交互

1 Unity 发布 apk 1.1 安装 Android Build Support 在 Unity Hub 中打开添加模块窗口&#xff0c;操作如下。 选择 Android Build Support 安装&#xff0c;如下&#xff08;笔者这里已安装过&#xff09;。 创建一个 Unity 项目&#xff0c;依次点击【File→Build Settings→…

springboot maven项目环境搭建idea

springboot maven项目环境搭建idea 文章目录 springboot maven项目环境搭建idea用到的软件idea下载和安装java下载和安装maven下载和安装安装maven添加JAVA_HOME路径&#xff0c;增加JRE环境修改conf/settings.xml&#xff0c;请参考以下 项目idea配置打开现有项目run或build打…

ubuntu 安装卸载 deb软件

install sudo dpkg -i 软件包名.deb uninstall sudo apt-get remove 软件包名称 reference https://help.ubuntu.com/kubuntu/desktopguide/zh_CN/manual-install.html

什么是WMS系统条码化管理

WMS系统是一种用于仓库管理的信息化系统&#xff0c;旨在提高仓库操作的效率和准确性。而在WMS系统中&#xff0c;条码化管理是一项关键的技术和方法&#xff0c;它通过将商品和物料打上条码&#xff0c;并利用扫描设备进行数据采集和处理&#xff0c;实现了仓库管理的全面自动…

深度学习模型笔记

加载和保存模型参数 保存模型参数 net MLP() # 此处省略训练过程&#xff0c;在训练之后&#xff0c;保存模型参数 # 保存字典格式的模型参数&#xff0c;模型参数名 torch.save(net.state_dict(), mlp.params) 加载模型参数 clone MLP() # 加载模型参数 clone.load_state…

【Axios封装示例Vue2】

文章目录 为什么要封装axios&#xff1f;如何封装axios在Vue组件中使用封装的axios 为什么要封装axios&#xff1f; 在Vue 2项目中&#xff0c;直接在组件中使用axios可能会导致以下问题&#xff1a; 代码重复&#xff1a;每个组件都需要导入axios并编写相似的请求代码&#…

开源大数据组件

集群&#xff1a;DataSphereStudio https://gitee.com/WeBank/DataSphereStudio?utm_sourcealading&utm_campaignrepo BI报表&#xff1a;DataEase https://github.com/dataease/dataease 集群管理 HDP/CDH/CDP – Todo