js根据name获取value_js 函数的重载

3d7c92e7dbc949fc0e0fc12be567cb3b.png

js 函数的重载

我们知道,很多编程语言都有函数的重载。

所谓的重载,看定义:

重载,简单说,就是函数或者方法有相同的名称,但是参数列表不相同的情形,这样的同名不同参数的函数或者方法之间,互相称之为重载函数或者方法。

同名函数,根据传入的参数类型不同,来执行对应的方法。

所以从这个定义中,我们能够得出,js 并不具备函数的重载功能。

因为 js 不用对传入的参数的类型,进行严格的定义。所以,即使我们写了同名的函数,也只会导致后面的函数会将前面的函数覆盖掉。

现在我们假设,即使 js 同名函数能够共存,但是我们无法知道不同的同名函数分别接收什么类型的参数,同样无法判断该调用哪一个方法。

但是我们在平时写代码的过程中,有一种情况是比较常见的。

比如,我们现在有一个对象 People,有私有属性 name 和 age。

因为 JavaScript 中没有私有属性,所以我们只能通过闭包来模拟私有属性。

所以,我们在构造函数内部定义 name 和 age 对象,通过 get,set 接口来统一读取和修改他们。

代码见下面所示。

var 

用的时候,我们可以这样:

// 防止构造函数中没用 new 我们检测了一下 this 的指向

可以看到,这里,我们通过用了 get 和 set 函数,来对外提供接口。

那么,我们想一想,我们能不能将这两个函数合并一下,通过同一个函数,来实现这两种功能呢?

答案当然是肯定的,我么可以改写一下我们之前的构造函数:

var 

再看下我们的使用过程:

var 

可以看出来,这样一改,这个接口调用起来就很方便了。

虽然乍一看,这样该写了以后,好像不太好理解。但是如果习惯了这种写法以后,你会感受到这种写法的奇妙之处。简直太方便了,传一个参数就是拿值,传两个参数,就是改写对应的值。

当然这种写法,是我们在架构我们的项目的时候,有这种意识,这当然算是一种比较好的写法了。

但是如果我们刚开始架构的时候,是这样写的:

var 

随着我们项目的进行,可能在原型链上,有很多方法都用到了 this._name 或者 this._age。

这个时候,如果想要迁移我们的变量成闭包内部的变量,当然是不划算的,改写起来太麻烦了。

但是如果我们又想要提供一个类似于之前的 o 函数,该怎么做呢?

也许又童鞋得第一反应是,这还不简单,三下五除二的进行了如下的拓展:

People

这样写固然没有问题,但是还是不太具备扩展性。

如果,某一天,我们突发奇想,想要拓展一下这个 o 方法,当不传参数的时候,我们想要列出实例上所有的属性。

我们固然可以通过重载这个 o 方法来实现,但是总感觉不够优雅。

现在有一种更为优雅的方式。

我们可以创建一个 overload 方法用于重载:

function 

我们可以这样调用:

overload

我们还可以继续扩展:

overload

可以看出来,我们的重载函数,非常的强大,扩展性也是非常的强。

可以对任意一个对象上的函数进行重载,当然这里是通过识别参数的个数来进行重载的,这也是现阶段 js 中所能做到的极限了。

这个小小的 overload 方法,同样也是通过闭包来实现的重载。

原理就是通过比较函数的参数与传入的参数个数是否相等,相等则用调用当前函数进行执行。如果不相等,那么调用 old 函数,进行执行。而 old 函数同样会递归执行参数个数判断这一过程,这样就实现了根据参数的个数对函数进行重载。

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

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

相关文章

存储过程循环遍历一个月的每一天的函数_JavaScript 循环:如何处理 async/await

同步循环很久以前我写的循环是这样的:后来 JavaScript 提供了很多新的特性,现在我们会更倾向于用下面这种写法:在开发过程可能会有这么一种需求,我们需要在循环中异步处理 item,那么可以怎么做呢?异步循环如…

Angular程序架构

component,组件是Angular应用的基本构建块,你可以把一个组件理解为一段带有业务逻辑和数据的html。组件下面可以有子组件,子组件下有孙子组件,像树一样。指令:允许你向html元素添加自定义行为。模块Ngmodule&#xff1…

易语言python1.1模块_易语言之编写模块与引入模块

本人并不精通易语言,只是对其进行一定了解后做一个简单的总结。直接新建一个易语言模块,然后添加子程序即可。子程序当然可以随意命名,实际上,易语言的子程序就和c语言的函数,java中的方法一样(实际上,java…

spring boot开发笔记——mybatis

概述 mybatis框架的优点,就不用多说了,今天这边干货主要讲mybatis的逆向工程,以及springboot的集成技巧,和分页的使用 因为在日常的开发中,当碰到特殊需求之类会手动写一下sql语句,大部分的时候完全可以用m…

Angular项目目录介绍

通过 ng new 项目名生成的项目 一级目录 Angular cli 工具生成的目录文件名不要随意修改,要不然会影响工具的使用。e2e:端到端的测试目录,用来做自动测试的。node_modules:Angular第三方包。src:应用源代码目录&#…

jvm内存模型_四种视角看JVM内存模型

1.JVM运行视角程序计数器Java虚拟机栈本地方法栈Java堆方法区1 .程序计数器程序计数器是一块较小的内存空间,它可以看作是当前线程所执行的行号指示器。这个计数器记录的是正在执行的虚拟机字节码指令的地址。此内存区域是唯一一个在JAVA虚拟机规范中没有规定任何Ou…

Tomcat服务脚本

为什么80%的码农都做不了架构师?>>> #!/bin/bash ### BEGIN INIT INFO # Provides: tomcat # Required-Start: $remote_fs $syslog # Required-Stop: $remote_fs $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # S…

oracle 取当前日期时间的前一天前一小时前一分钟前一秒

原文链接:http://wentao365.iteye.com/blog/779492 点击阅读原文 --------------------------------------------------------------------------- SELECT 当前时间 TITLE, TO_CHAR(SYSDATE, yyyy-mm-dd hh24:mi:ss) TIME FROM DUAL --当前时间 UNION ALL S…

mysql8事务级别_Mysql几种事务隔离级别

前言:之前对mysql的基础知识通过了几篇博客进行了一个详解,包括从数据库系统的原理以及最基本的操作使用,此篇博客将主要对mysql的事务级别进行实战分析1.什么是事务?事务是应用程序中一系列严密的操作,所有操作必须成…

控制台应用和空项目有什么区别_互联网小程序的应用以及APP的应用有什么区别及发展...

随时移动互联网进入的千家万户,互联网的手机应用程序也渐渐的在市场上流行起来了。今天主要跟大家谈一下互联网小程序的应用以及APP的应用有什么区别以及未来的发展趋。未来会流行什么手机应用或者APP应用,我带大家都为了解一下。下边先来了解一下小程序…

day19_java基础加强_动态代理+注解+类加载器

一、动态代理 1.1、代理模式 什么是代理模式及其作用? Proxy Pattern(即:代理模式),23种常用的面向对象软件的设计模式之一。        代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问。 …

使用循环链表实现一个通讯录的管理程序_【LeetCode链表题型总结】

点击上方蓝字,关注公众号链表概念的讲解链表是什么链表是一种线性数据结构,每个节点都存有数据,通过指针将各个节点链接在一起。链表的性质一致性: 每个节点有相同的数据结构,相同的数据大小,内存中占据相同的大小&…

python的kite下载安装及使用_Kite下载|Kite Python编程工具 V1.2020.1203.0 最新版下载 - 下载银行...

Kite是一款专为Python打造的一款代码补全软件,如果你正在学习Python或是从事与Python相关的编程工作,那么这款软件绝对是你的好帮手!其会智能判断用户想要输入的每个代码字段,并在所有库中进行匹配相应的内容,如果看到…

Linux 升级 Python 至 3.x

原文链接:http://blog.csdn.net/liang19890820/article/details/51079633 -------------------------------------------- 简述 CentOS 7 中默认安装了 Python,版本比较低(2.7.5),为了使用新版 3.x,需要对…

Sublime Text 3 配置python交互运行环境的快捷键

2019独角兽企业重金招聘Python工程师标准>>> 使用Sublime Text 3能以轻量级的环境写python脚本,运行python代码。为了更加方便地调用python脚本,通过在Sublime Text 3中绑定快捷键的方式,实现一键调用python交互运行环境&#xff…

xftp如何搜索文件_头条搜索站长平台如何添加网站和sitemap文件?附图文教程

头条搜索站长平台已经上线了,目前我们广大站长都可以登录该平台后添加新网站和提交 sitemap 地图文件,建议大家可以前往尝试一下,多一个搜索平台就多一条路,认为倒是挺好的。下面就跟大家简单介绍头条搜索站长平台如何添加网站和提…

彩铅练习,花船

图片发自简书App图片发自简书App

我的女朋友漏电了–论C++中的失败(failure),缺陷(bug)和异常(exception)

先做个广告置入,如果喜欢这篇文章,你可以到 zhaoyan.website/blog 去查看于此类似的C/C文章。 我承认有点标题党了,不过这真的是一篇写软件的文章,所以如果你已经抽出了一张面巾纸,那么趁早再把它完美的放回去。这篇软…

SQLplus 和mysql区别_mysql和oracle的区别有哪些

MySQL和Oracle都是流行的关系数据库管理系统(RDBMS),在世界各地广泛使用;大多数数据库以类似的方式工作,但MySQL和Oracle的这里和那里总是存在一些差异的。本篇文章就给大家比较Oracle和MySQL,介绍Oracle和MySQL之间的区别&#x…

127.0.0.1与localhost的区别

2019独角兽企业重金招聘Python工程师标准>>> 区别1: localhost也叫local ,正确的解释是:本地服务器 127.0.0.1在windows等系统的正确解释是:本机地址(本机服务器) 他们的解析通过本机的host文件,windows自动将localhost解析为127.…