javascript - 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 类一起工作,但不幸的是,不能在类组件中调用钩子。
解决方案
回答您实际提出的问题,这是可能的,但可能不是一个好主意。一种方法是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 引擎对其实现的优化。现在,您使用它的目的可能并不重要,这取决于它是否是关键路径(以及去优化的明显程度),所以它肯定是一个选项。
您已经说过您正在尝试这样做,以便您可以在类组件中使用挂钩。正如我在评论中所说,这可能行不通,即使行得通,也可能不是您的最佳解决方案
我会退后一步说,如果你发现自己想从类组件中调用一个钩子,你最好的选择是:
构建与钩子等效的基于类的功能并且不使用钩子,或者
将类组件更改为功能组件,以便您可以以正常方式使用钩子
推荐阅读
- nhibernate - 如何逃脱“?” 在 NHibernate 中的 Expression.Sql (C#)
- android - 网站无法在安卓手机上滚动
- azure - Visual Studio 2017 - 流分析项目本地运行失败
- bash - awk - 如果域已经匹配,则跳过子域行
- angular - Angular mat-table 删除硬编码的行
- python - 如何在 python 的不同子目录中更改多个文件名?
- javascript - 仅显示相关的下拉选项
- google-cloud-storage - 消失的水桶,如何调查
- c - 为什么 scanf 不能与我的字符串一起使用,而是不会停止到定界符并创建一堆变成空的数字和字母?
- spring-boot - 如何确定Spring容器为@FeignClient注入了哪个默认http客户端?