首页 > 解决方案 > JavaScript 中函数类的默认处理程序

问题描述

我想知道是否可以让功能类具有默认调用方法。让我详细说明。

function Foo(){
  /*some logic*/
  Foo.prototype.aletUser = function alertUser(message) {
    alert(message);
  }
}

假设上面的代码是我的功能类(如果我对上述结构的命名错误,请告诉我),我实例化了这个结构之一。

let param = new Foo();

现在,我希望调用以下内容并希望它调用我的原型Foo.alertUser

param('Hey There')

如何做到这一点?提前致谢。


我的方法背后的更多见解

我正在使用 React Native,我希望param('Hey There')在函数内部使用一个钩子,但我没有想法,我知道如何使它与 JavaScript 类一起工作,但不幸的是,不能在类组件中调用钩子。

标签: javascriptreact-nativereact-hooksprototypejs

解决方案


回答您实际提出的问题,这是可能的,但可能不是一个好主意。一种方法是new Foo创建一个函数,然后更改其原型(这通常不是一个好主意),如下所示:

function Foo() {
    // Create a function, the change its prototype to
    // `Foo.prototype` and return it
    const retval = function alertUser(param) {
        console.log(param);
    };
    Object.setPrototypeOf(retval, Foo.prototype);
    return retval;
}
// Make `Foo.prototype` use `Function.prototype` as its prototype
Foo.prototype = Object.create(Function.prototype);
Foo.prototype.constructor = Foo;


const param = new Foo();
param("Hi there");


但是,同样,这可能不是一个好主意,原因如下:

  • 更改对象的原型可能会取消 JavaScript 引擎对其实现的优化。现在,您使用它的目的可能并不重要,这取决于它是否是关键路径(以及去优化的明显程度),所以它肯定是一个选项。

  • 您已经说过您正在尝试这样做,以便您可以在类组件中使用挂钩。正如我在评论中所说,这可能行不通,即使行得通,也可能不是您的最佳解决方案

我会退后一步说,如果你发现自己想从类组件中调用一个钩子,你最好的选择是:

  1. 构建与钩子等效的基于类的功能并且不使用钩子,或者

  2. 将类组件更改为功能组件,以便您可以以正常方式使用钩子


推荐阅读