【问题标题】:overloading vs overriding in javascriptjavascript中的重载与覆盖
【发布时间】:2016-03-24 01:31:22
【问题描述】:

在最近的一次 JavaScript 采访中,有人问我overloading vs overriding。我知道这是Java中的一个概念。但是在 JavaScript 中是否有类似的东西,如果有的话,代码示例会是什么?我的理解是重载在 javascript 中并不常见。为什么要在 JS 中使用“overloading”?

OverRiding 对我来说更清楚一些 - 一个过度骑行的例子是在子类化中,您从超类继承但过度使用一些方法/属性来为子类创建独特的方法/属性。

【问题讨论】:

  • 重载在 JavaScript 中并不像其他语言那样真正存在。你具体问了什么问题?
  • 基本解释一下区别。在一家正在从 Java 过渡到 NodeJS 的公司
  • 不要从 Java 开发人员的经典 OOP 角度来处理这个问题。 Javascript 不像 Java 那样是 OOP,它是原型继承。
  • 除此之外,据我所知,它根本没有超载。
  • javascript 不支持重载 - 输入参数的数量或顺序没有限制,因此只能存在一种具有特定名称的方法。通过原型继承支持覆盖。

标签: javascript node.js computer-science object-oriented-analysis


【解决方案1】:

JavaScript 不支持重载。

JavaScript 支持覆盖,所以如果你定义了两个同名的函数,最后一个定义的函数将覆盖之前定义的版本,并且每次调用该函数时,都会执行最后一个定义的函数。

更多请阅读这里http://blog.mastykarz.nl/overloading-functions-javascript/

【讨论】:

  • 嗯,这不是真的。 Javascript 不以“规范”方式处理它,但有许多模式可以处理 javascript 中的重载。作为一个优秀的 javascript 程序员,处理它们很重要。
  • @Maksim 我确定 JS 不支持重载。在 JS 中,您的函数只是另一个对象,因此当您重新分配对该变量的引用时,变量只是对该对象的引用变量丢失并且对象被 GCed.. 并且新函数排序替换但不覆盖实际的.. 在覆盖这两个函数的引用应该存在只是范围不同
  • 我说没有重载,但有一些模式在功能上具有类似的东西。让我们说选项模式。当然,函数是一个对象,javascript 不会使用签名“跟踪”函数,而只是使用 var 名称。重载只是处理传递给函数的不同类型的参数或数据类型的方式。所以是的,在 javascript 中有重载,但它是使用模式而不是语言中的原生来完成的。
【解决方案2】:

这里有一个“伪造”JavaScript 函数重载的好例子:https://stackoverflow.com/a/457589/2754135

你基本上在你的函数中使用一个参数来接受一个对象,这个对象包含你想要的任意数量的参数。

显然它实际上并没有重载,因为这在 JavaScript 中是不可能的。

【讨论】:

    【解决方案3】:

    javascript 中不需要传统的重载概念,因为它具有动态特性。在更传统的编程语言中,如 Java,您可以使用不同的签名多次定义一个方法,并且该语言将仅使用签名正确地使用您想要调用的方法:这称为方法重载。另一方面,覆盖是在子类中重新定义父类的方法的可能性。 要在 javascript 中进行重载,通常的做法是使用称为选项的最后一个参数。例如

    function yourFunction(firstParam, secondParam, options) {};

    选项只是一个 javascript 对象,其中包含您要传递的道具。然后你可以使用所谓的“选项”模式来检查道具。 由于语言的原型性质,在纯 javascript 中重写它更困难:当你用一个新的基础对象“扩展”一个基础对象时,你可以使用构造函数对象的 .call() 函数传递这个来装饰新的使用父道具创建的对象。

    【讨论】:

      【解决方案4】:

      虽然 JavaScript 不支持传统意义上的重载,但

      可以随时将超过所需的参数传递给 JavaScript 方法,并通过 arguments 变量进行访问。这在功能上是相似的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-10-24
        • 1970-01-01
        • 2022-01-02
        • 2012-02-16
        • 2011-04-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多