使用变量作为对象和函数

时间:2015-07-19 21:15:11

标签: javascript function object mocking

我正在尝试模拟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
        }
    };
}

但我不能一起使用这两种方法。我需要找到一种允许两种语法的方法。 您是否知道如何将_字符用作对象和函数?

3 个答案:

答案 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);