我正在尝试模拟JavaScript库Underscore.js中的times
函数。
此函数接受两种语法:
_.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
}
};
}
但我不能一起使用这两种方法。我需要找到一种允许两种语法的方法。
您是否知道如何将_
字符用作对象和函数?
答案 0 :(得分: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 _;
})();
在这里,您可以从函数也是对象这一事实中受益,因此可以拥有属性。
答案 1 :(得分:3)
函数是Javascript中的对象,所以你可以这样做:
var _ = function(a,b) { /* ... */ };
_.times = _;
答案 2 :(得分: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);