Javascript 将变量用作对象和函数

Javascript 将变量用作对象和函数,javascript,function,object,mocking,Javascript,Function,Object,Mocking,我试图模拟JavaScript库中的times函数 此函数接受两种语法: _.times(3, function(n) { console.log("hello " + n); }); 及 到目前为止,我成功地模拟了第一个对象,创建了一个\uu对象,如下所示: var _ = { times: function(reps, iteratee) { // a loop } }; 第二种语法是通过创建一个函数返回一个对象: function _(n) {

我试图模拟JavaScript库中的
times
函数

此函数接受两种语法:

_.times(3, function(n) {
    console.log("hello " + n);
});

到目前为止,我成功地模拟了第一个对象,创建了一个
\uu
对象,如下所示:

var _ = {
    times: function(reps, iteratee) {
        // a loop
    }
};
第二种语法是通过创建一个
函数返回一个对象:

function _(n) {
    return {
        times: function(iteratee) {
            // a loop
        }
    };
}
但我不能同时使用这两种方法。我需要找到一种方法来允许两种语法。
你知道我如何使用
\ucode>字符作为对象和函数吗?

函数是Javascript中的对象,所以你可以这样做:

var _ = function(a,b) { /* ... */ };
_.times = _;
var _ = (function() {

    var times = function(n, iteratee) {
        // a loop
    };

    function _(n) {
        return {times: function(iteratee) {
            return times(n, iteratee);
        }}; // or shorter: {times: times.bind(null, n)}
    }

    _.times = times;

    return _;
})();

您可以在定义函数后扩展它。试试这个:

函数(n){
返回{
时间:函数(迭代对象){
而(n-->0)
iteratee();
}
};
}
_.times=函数(重复、迭代){
而(重复次数-->0)
iteratee();
};
函数iter(){
console.log('iter!');
}
_(3) .泰晤士报(iter);
console.log('---');

_.次(5次,国际热核实验堆)您应该能够组合如下两种语法:

var _ = function(a,b) { /* ... */ };
_.times = _;
var _ = (function() {

    var times = function(n, iteratee) {
        // a loop
    };

    function _(n) {
        return {times: function(iteratee) {
            return times(n, iteratee);
        }}; // or shorter: {times: times.bind(null, n)}
    }

    _.times = times;

    return _;
})();

在这里,函数也是对象,因此可以具有属性,这一点让您受益匪浅。

这不仅仅是使
\uu3.times(fn)
工作的原因。您必须从函数返回一个对象,该函数同时捕获实例数据中的
3
,并且对象上有
.times()
方法。@jfriend00您是对的,但是如果OP只是试图模拟它,它实际上不必做任何工作,对吗?OP想要一些工作。我认为他们的术语“mock”在这里的意思是他们想复制
.times()
的工作方式。谢谢,这很有效!(虽然我为
..times=
编写了一个新函数(是的,我说的“mocking”是指复制这个函数的工作方式;-))但是如果在返回函数(n)之前添加类似if(arguments.length>1){times(n,arguments[1])}的内容,这是完美的。。。