首页 > 解决方案 > 创建可以通过点表示法调用的子函数

问题描述

背景: 基于这个关于如何使用 Jest 公开用于单元测试的库的问题。我现在想创建一类函数,可以在点表示法中用点表示法调用(这甚至可能是不可能的)。首先是我目前正在使用的一些方法:

这是我如何修改 JavaScript 数学函数的示例:

Math.mean = function(numericArray){
    if(Math.isNumericArray(numericArray)){
        return math.mean(numericArray);
    }
    return false;
}

仅供参考,小写的 math.mean() 调用是对数学库的调用:https://mathjs.org/, isNumericArray 只是一个验证器,以确保传入的是数字数组。

然后我像这样导出它:

module.exports.mean = exports = Math.mean;

所以 Jest 可以在我的单元测试中看到它。

我的实际问题: 我想做的是创建一个名为 Math.acs 的上层“类”,因此您可以使用 Math.acs 调用它。然后它会有子函数(EG:foo() & bar())所以你可以这样称呼它们:Math.acs.foo(data); 或 Math.acs.bar(data);

我试图将它们封装到 IIFE 中

Math.acs = (function(data) {
    function foo(data){
        console.log('hi mom');
    };
    function bar(data){
        console.log("hi dad");
    }
    return bar;
})();

哪个不起作用(CLI 看不到 Math.acs 下面的任何内容),我还尝试了函数内部的直接函数,这些函数也不起作用。

如果这不可能,我不会死,但它会使 acs 模块中所需的半打左右的功能集中化并且更易于维护。如果不可能,我可以按照上面所示的方式编写各个数学模块。

标签: javascriptfunction

解决方案


您需要获取具有属性的函数并返回此函数。

Math.acs = (function(data) {
    function f() {};
    f.foo = function (data) { console.log('hi mom'); };
    f.bar = function (data) { console.log("hi dad"); };
    return f;
})();

推荐阅读