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

超载的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:提案运营商超载

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

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

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

    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开发人员

    node-bruteforce:NodeJS HTTP登录表单Bruteforcer

    将NodeJS的功能引入Web表单暴力破解... 存在许多出色的开源蛮力工具。 但是,他们无法处理嵌入Rails和Django中的基于现时的CSRF保护。 该工具通过首先从登录页面获取CSRF令牌,然后发送登录POST请求来解决此问题。 ...

    mia-js-core:mia.js-中间件API框架-核心模块

    mia.js的重点是充当移动应用程序的中间件后端,以将所有通信都集中在一个地方,并避免移动应用程序超载。 传递,聚合或修改其他外部api,或者在mia.js中创建自己的api,并将它们捆绑在一起作为您的项目api。 使用多...

    Parser-for-Wizard101:Wizard101卡的刮板和解析器

    在许多情况下,仅读取诸如“损坏”或“修复”之类的简单关键字是不够的:执行多种功能的卡可能具有多个关键字,否则它们会相互冲突。 该程序能够确定卡描述的不同部分或短语,填写缺失信息(如有),并以JSON格式...

    mia-js:mia.js-中间件API框架

    mia.js的重点是充当移动应用程序的中间件后端,以将所有通信都集中在一个地方,并避免移动应用程序超载。 传递,聚合或修改其他外部api,或在mia.js中创建您自己的一个,并将它们捆绑为您的项目api。 使用多个项目...

    super-serverless-sample:模拟BBB投票系统的无服务器后端

    EventBridge:功能强大的消息代理,允许并行并行执行每个消息。 消息接收速率高,处理能力高 DynamoDB:存储个人选票 SQS:批量发送消息以进行异步投票计数。 发送批次可加快计数速度。 同时,SQS允许进行高度可控的...

    dijnet-bot:您所有的帐户都集中在一个地方

    准备就绪:由于具有命令行界面和增量下载功能,因此非常适合用作计划任务。 组织者:按服务提供商,服务和日期将下载的文件组织到文件夹中。 温和:在下载页面和文件之间等待几秒钟,以免使奖赏服务器超载。 用 ...

    cultro:参数长度匹配函数变得简单

    Cultro,参数匹配函数变得简单为什么是... Cultro 在拉丁语中是“超载”的意思。文档我认为代码比文档更能说明问题,所以我链接了一个examples.js来引用所有功能。 Cultro 是开源的,因此欢迎任何分支、主演和想法。

Global site tag (gtag.js) - Google Analytics