`
呼延浩云
  • 浏览: 84673 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
69e5c1d2-1364-320a-a0f2-0de5143310d8
互联网的那点事
浏览量:10958
社区版块
存档分类
最新评论

超载的JavaScript功能

阅读更多

介绍

一个JavaScript的优势在于它是弱类型,它允许很大的灵活性,不幸的是这意味着函数重载不可用。我们没有明确的参数类型声明,因此,我们不能“输入”参数时我们声明函数

但是有多少,我们真的需要函数重载?我们不能没有它,我们可以简单地具备的功能检查传递的参数类型和参数长度以及基于这些,决定的逻辑。这实际上是有多少开发商选择做它,但是在我看来,这使得代码的可读性/维护,同时也增加了自定义代码,以每个需要重载的逻辑功能,这引入了层编码,可能引入错误。因此,让我们试试,看看我们如何能够最好地在JavaScript中实现这一目标。

我环顾四周净,并有几个方法来实现这一目标。然而,他们没有那么灵活和快速实施,因为我想要的。如果我想从A点去 – > B点在我的代码(有函数重载功能的B点),我想这样做,用最少的代码。我希望能够把它添加到我的已经存在的代码在尽可能短的时间内可能和我平时喜欢在这种事情在配置方式的约定。

在这篇文章中,我会要求你做一个函数调用你的JavaScript类,并与该呼叫时,您将自动拥有函数重载。仍然有你需要遵循一些约定,但它们是简单和直接的,有需要得到这个工作,几乎很少或根本没有配置。

我们需要什么?

首先,我们需要一种方法来通常写我们的代码没有超载,但应写入记住一些约定,允许超载可以很容易地添加。第二,我们需要一个简单的方式,从我们定义的参数“告诉”类型的信息。

对于第一步,我选择了写作,将被重载为一个函数不同功能的简单方法。在这里,我要编号的职能。假设你有一个名为3个不同功能的插件需要被重载,那么你就写你的原型功能的方式是通过增加一个后缀,以每个函数调用,这个后缀是一个简单的计数器。一个例子解释了这个最好的。我想有一个调用函数的3种不同口味,那么我需要做的是创建一个名为三种功能ADD1ADD2ADD3后来,我的代码会去寻找这些“编号的函数”,并结合成一个重载的函数,它的名字是没有任何号码,以便:ADD1ADD2ADD3 … ADDX - > 添加(超载,为所有这些功能) 。

对于第二步,我需要一种简单,快速实施和简单的记住告诉每个参数的类型的方法。我的参数将开始与一个或多个字母,将描述的类型,然后停在第一个大写字母,这其中的参数的名称开始。举几个例子:nNumericParamstrName中oSomeObject等等…在前面的例子中,这些参数类型“ Ñ “,” 海峡 “和” Ö “。我们将这些映射到实际类型的一个非常简单的对象,我们将传递到创建重载为我们的功能。

因此,让我们回顾一下,给我们如何需要编写一个类的小完整的例子。

// 一个无用的类真的,但一个很好的例子
function AdditionClass() {
  this.IsAdditionClass = true;
}
AdditionClass.prototype = {
  add1: function(nValue1, nValue2) {
    if (console)
      console.log('calling add1 with params:', arguments);
    return nValue1 + nValue2;
  },
  add2: function(nValue, strValue) {
    if (console)
      console.log('calling add2 with params:', arguments);
    return nValue + strValue;
  },
  add3: function(nValue1, nValue2, nValue3) {
    if (console)
      console.log('calling add3 with params:', arguments);
    return nValue1 + nValue2 + nValue3;
  }
}

在这个类中,我们写了这些功能ADD1ADD2ADD3将被过载到调用函数加载(请注意,你不应该创建或使用该函数名称添加在您的类,或者overloader将失败的功能)。我们还使用了匈牙利命名法,这将使我们能够“告诉”它的类型的命名我们的参数。

使用代码

要添加函数重载,我们需要调用只是一个功能。overloadPrototype

这个函数有两个参数,第一个参数是类的构造函数,第二个参数是该匈牙利表示法前缀映射到实际的类型,你可以从得到一个对象typeof运算您可能需要自定义类型匹配逻辑在自己的代码,所以为了方便您的实际匹配情况发生在一个叫做函数checkTypesMatch它获取传递的参数本身,它应该属于参数的匈牙利前缀。我想在此指出的参数检查并不总是采用,如果不同的功能超载具有独特的参数的长度,则该重载的代码将完全根据参数的长度决定,这将在后面详细在这篇文章中解释。

在前面的例子中,调用加上超载看起来像这样:

overloadFunction(AdditionClass, { n : "number", str : "string", o : "object" });

引擎盖下

那么,该函数overloadFunction真的。首先,它遍历传入构造函数的原型的功能,一旦它找到一个函数的最后一个字符为“ 1 “,它通过对这个函数名来命名函数processFunctions,将尝试挂钩的过载。

该功能processFunctions开始获取传递。在这个例子中,函数名的基本名称,传递函数名“ ADD1 “是指基本名称是增加和新的重载函数将使用这个名称来创建。

第二,processFunctions将循环并试图找到所有的计数功能,在本例中ADD1ADD2ADD3它将停止时,它无法找到任何更多的功能,或当计数值最大为10个功能(10重载)。(需要注意的是维护你的代码的时候,你不能离开的差距在编号的功能)。我认为你不应该有超过10多载,因为这可能会使事情慢的重载功能,我们将在本文后面走了过来性能。如果你有超过10重载,你真的需要它们,你可能需要增加循环的上端。

第三,processFunctions会整理此基础上他们的论据长度的函数列表,在这个过程中,它会检查,看看是否有重复的参数长度与否。在这里,我们有两种情况,重复的长度或没有,这是表示与变量duplicateLen

让我们以轻松的情况下第一,当我们没有重复的长度。这种情况下,更容易编写重载的函数和过载的逻辑也非常快,它的成本基本上是间接的函数调用只是另一个层次。processFunctions现在交出构造函数,的计算功能和基本名称的数组要叫另一个函数createLengthOverload

该函数createLengthOverload创建一个具有基本名称(这里是“一个新的功能添加 “),这功能很简单,它会查找传递参数的长度并根据该会调用相应的原始功能。(这里是一个ADD1ADD2ADD3)。

在我们的第二种情况,在那里我们有有一个共同的长度的功能,很明显,我们需要决定哪些功能基于类型的信息来调用,这就是事情变得丑陋,也只是一点点。 微笑| :)

在这种情况下,首先我们需要创建一个新的数据结构(称为数据中的代码),它整合了长度,这意味着我们组具有相同长度的功能。的长度X作为一个键和值的函数的信息的数组。

现在,我们需要去在这个新的数据结构(数据),并检查其长度有一个以上的功能,在我们上面的例子,ADD1ADD2都有参数长度2和ADD3具有参数长度3。所以ADD3是安全的,它并没有对其参数的长度是竞争的其他功能,但是ADD1ADD2做竞争,所以要解决哪一个打电话的方式将根据类型匹配的决定(次)。对于每个组都有一个共同的长度的功能,我们现在创建一个新的数据结构,它们被称为annotationArray,此架构将“描述”为每个函数参数的类型有(这里的两个函数ADD1ADD2)。annotationArray将包含ADD1:['号','数']和ADD2:['号','字符串']。在这一点上,我们做了一些例行性检查,我们需要确保这些不同的功能至少有一个不同的参数类型,否则我们无法决定哪一个电话,至少一个参数应该是不同的每个不同的功能(在我们的例子中,第二个参数是数字ADD1和字符串ADD2)。输入信息常用的参数下一个被删除(最优化标志设置),在我们的例子中,我们删除的类型信息的第一个参数(s)的ADD1ADD2,因为它们是两个数字,他们不为任何目的的决策,我们只是不停的第二个参数的信息。现在,我们已经准备好创建我们的重载函数,我们通过对数据结构以及基本名称和构造函数的功能createTypeOverload

该函数createTypeOverload将增加的基本名称(这里是“一个新的功能添加 “)相似,createLengthOverload但逻辑是不同的。新创建的附加 ​​功能,将有机会获得的(数据我们已经创建和早期抛光)的数据结构。在此基础上,并传递给它的参数的长度,这将决定要调用哪个函数(ADD1ADD2ADD3)。如果它是通过3个参数,它会直接调用ADD3,如果通过了两项,它会经过候选函数,在这种情况下是ADD1ADD2,并会尝试消除那些不适合基于数据类型,最终只是一个函数应该赢得这场比赛。

性能

显然,事情不会发生神奇,有一个点球支付,问题是有多少是这个点球,是否愿意支付它。在其他语言中,编译器的重载让他们来免费的,在JavaScript中我们要做什么样的编译器,但大致在运行时。如果你有关键的代码,优化它没有函数重载将要走的路,当然,但是如果你的代码是不是很关键,让我们看看有多少是我们的惩罚。在这里的参数的长度是唯一在所有被重载的功能的情况下,这种情况下是速度快,非常快,几乎没有一个点球我会说。如果参数的长度都小于10,我用一个数组的长度参数为指标,要调用的函数,所以这里的处罚仅仅是一个间接层是来自调用应用上的功能本身。如果参数的长度都大于10,然后我用一个哈希得到的函数调用,这将是稍贵。当我们有共同的长度,我们必须去在不同的候选人,并消除它们一个接一个,所以根据不同的共享相同的参数长度函数的数目,刑罚会有所不同。如果我有时间,我会做一些压力测试,并发布一些数字对于一些常见的情况。

1
0
分享到:
评论

相关推荐

    overlode:Javascript函数重载实用程序

    超越Javascript功能超载覆盖实用程序。 该实用程序独特的界面将使您更容易使用叠加功能。快速开始使用npm安装。 > npm install overlode 或下载源文件 。 编写您的第一个叠加函数。 在这里,我们使用帮助进行检查。 ...

    JavaScript禁止用户多次提交的两种方法

     //禁止默认行为 因为这里要模拟服务器超载的时候,所以需要先禁止掉submit按钮自动提交的功能  function preventDef(event){  event=event||window.event;  if(event.preventDefault){  return event....

    复合形法matlab代码-proposal-operator-overloading:提案运营商超载

    希望,具体性将帮助我们决定是否走这条道路,这可以帮助委员会根据长期的功能要求,以一种或多种方式,朝着具体的下一步迈进。 状态:第一阶段 实例探究 操作员重载就是启用更丰富的库。 本节给出了这种丰富的库的四...

    照片上傳出問題了啦!請大大看一下

    6. JavaScript问题:许多网站的上传功能依赖JavaScript实现,如果浏览器禁用了JavaScript,上传可能会失败。检查浏览器设置,确保JavaScript是启用状态。 对于标签提及的“資料庫”部分,如果问题是关于数据库中的...

    校车安全智能管理系统设计.pdf

    2. 学生信息刷卡功能:由 Reader 与 Transponder 两部分组成学生上车必须刷卡,未刷卡有语音警报 , 此功能能够有效的帮助学校解决因司机个人修养而多载人员问题,有效地解决了校车超载的问题 , 同时在车载终端上和...

    Simulator.Elevator:模拟建筑物中电梯的使用

    在模拟器中,这可能涉及一个计数器,记录当前电梯内的人数,并检查新进入的乘客是否会使电梯超载。 4. **调度算法**:电梯的调度算法决定了电梯如何高效地响应多个请求。常见的算法有最短距离优先、最少停靠次数...

    elevator:我的电梯传奇游戏解决方案http

    7. **错误处理和边界条件**:确保游戏在各种情况下都能正常运行,需要对可能的错误进行预防和处理,如电梯超载、到达无效楼层等。 8. **模块化和封装**:使用ES6的模块系统(如`import`和`export`)可以将代码组织...

    haxe-overload:Haxe宏库支持重载函数

    haxe超载 Haxe宏库支持重载函数(通过静态扩展或抽象)。 状态:测试版/探索性 目的 Haxe本身不支持重载函数。 那可能是最好的。 但是,某些API使用重载方法会感觉更好。 例如,我建议使用JavaScript的 API(它...

    httpwatchpro4.1

    这种压力测试有助于评估网站在峰值流量下的稳定性和性能,提前发现可能的性能问题,比如服务器超载、数据库查询效率低下等。 在资源占用分析方面,HTTPWatch Pro 4.1能够详细列出每个页面加载时的资源使用情况,...

    Tomcat包的错.

    这些JavaScript事件处理函数可以有效地增强Web应用的安全性和用户体验,通过对特定键盘事件的监听来实现如防止刷新页面、禁止某些快捷键等功能。 总结来说,本文首先介绍了HTTP状态码的基本概念及其分类,并详细...

    用于 or-tools 车辆路线问题的 Node.js 绑定_C++_代码_下载

    在使用这个 Node.js 绑定时,开发者需要注意的是,由于是跨语言交互,性能可能会受到一定影响,但相比于纯 JavaScript 的解决方案,C++ 的高效执行仍然能带来显著的优化效果。此外,理解 `or-tools` 的基本概念和 ...

    物流配送信息系统源码

    在"物流配送信息网"这个文件中,可能包含了以下内容:源代码文件、数据库配置文件、系统配置文件、前端页面模板、CSS样式表、JavaScript脚本、图片资源以及可能的安装和使用文档。为了确保系统的正常运行,用户需要...

    信息处理技术员考试试题(八).docx

    内存容量超载是另一个概念;B.正确;C.数据类型超出范围指的是类型不匹配;D.数值格式不符合要求是指格式错误。 ### 15. MIDI文件与WAV文件的区别 - **知识点:** MIDI文件是音乐指令集,而WAV文件是波形音频文件。...

    netlify:网络化

    "可爱的超载"可能是一种形象的表达,形容项目在改进前可能存在功能过多或设计复杂的问题,而"周到的项目"则意味着在改造过程中考虑到了各个方面的细节,旨在提供更完善的用户体验。 由于提供的标签是“HTML”,我们...

    空运管理系统

    系统的主要功能可能包括以下几个方面: 1. **货物预订**:用户可以通过系统预订空运服务,输入货物信息如重量、体积、目的地等,系统会根据这些信息计算运费,并为货物生成唯一的追踪号。 2. **航班管理**:系统...

    try-catch-overloaded:该存储库包含用于重载TryCatch语句的TS和JS库

    尝试捕获超载该软件包包含重载Try / Catch语句的功能。动机添加自定义错误需要手动检查哪种类型的错误我们收到的是catch块,因为JS没有catch过载。 例如class UserNotFoundError extends Error { // ... Some ...

    qodaa:节点6的快速和肮脏AsyncAwait

    夸达节点6的快速和肮脏异步/等待用法通过Node的-r标志预加载qodaa :node -r qodaa my-app.js 异步/等待功能现在将在节点6中执行。如何Node的模块系统内部组件超载,代码以非常轻量级的方式在运行过程中进行了代码...

    react-redux-hooks-advanced-movie-app:这是一个很好的项目,我用原始,创意和动画而不是经典的电影应用程序进行装饰,并且我对代码感到满意。 :laptop::film_frames:您可以访问实时测试链接的详细信息

    我一直想为项目添加新功能,以充分利用React和redux,尤其是我尝试使redux端超载。 构建设置 # install dependencies $ npm install # serve with hot reload at localhost:3000 $ npm start ZAYBAK开发人员

Global site tag (gtag.js) - Google Analytics