2015-07-19 31 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)之前...... –