2015-07-19 51 views
10

我想模拟来自JavaScript库Underscore.jstimes函数。使用变量作为对象和函数

这个函数接受两种语法:

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

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

到目前为止,我成功通过创建一个_对象这样嘲笑的第一个:

var _ = { 
    times: function(reps, iteratee) { 
     // a loop 
    } 
}; 

而且第二种语法是创建一个返回对象的函数_

function _(n) { 
    return { 
     times: function(iteratee) { 
      // a loop 
     } 
    }; 
} 

但我不能一起使用这两种方法。我需要找到一种可以同时支持这两种语法的方法。 你知道我怎样才能把_这个角色作为一个对象来使用吗?

回答

3

函数是JavaScript对象,所以你可能只是做这样的事情:

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

除了这个,还有更多的工作使得_(3).times(fn)'工作。你必须从函数中返回一个对象,这个对象在实例数据中都捕获了'3',而对象上有'.times()'方法。 – jfriend00

+0

@ jfriend00你是对的,但是如果OP只是试图嘲笑它,它实际上并不需要做任何工作,对吧? –

+0

OP想要一些有效的东西。我认为他们在这里的术语“模拟”意味着他们想要'.times()'的工作方式。 – jfriend00

0

你可以定义它之后程度的功能。试试这个:

function _(n) { 
 
    return { 
 
    times: function(iteratee) { 
 
     while (n-- > 0) 
 
     iteratee(); 
 
    } 
 
    }; 
 
} 
 

 
_.times = function(reps, iteratee) { 
 
    while (reps-- > 0) 
 
    iteratee(); 
 
}; 
 

 
function iter() { 
 
    console.log('iter!'); 
 
} 
 

 
_(3).times(iter); 
 

 
console.log('----'); 
 

 
_.times(5, iter);

5

你应该能够两种语法结合起来是这样的:

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 _; 
})(); 

在这里,你一个事实,即功能也是对象,因此可以有属性受益。

+0

这是完美的,如果你添加像if(arguments.length> 1){times(n,arguments [1]); }返回函数_(n)之前...... –