javascript - 创建可以通过点表示法调用的子函数
问题描述
背景: 基于这个关于如何使用 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 模块中所需的半打左右的功能集中化并且更易于维护。如果不可能,我可以按照上面所示的方式编写各个数学模块。
解决方案
您需要获取具有属性的函数并返回此函数。
Math.acs = (function(data) {
function f() {};
f.foo = function (data) { console.log('hi mom'); };
f.bar = function (data) { console.log("hi dad"); };
return f;
})();