使用变量作为对象和函数

10

我试图对 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个回答

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

在这里,您可以受益于函数也是对象的事实,因此可以具有属性。


如果在函数_(n)内的返回语句之前添加类似if(arguments.length > 1){ times(n, arguments[1]); }这样的内容,那就完美了。 - Ryan Neuffer

3

函数是 JavaScript 中的对象,因此您可以像这样进行操作:

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

1
仅仅这些是不够的,要使 _(3).times(fn) 正常工作还需要更多的操作。你需要从函数中返回一个对象,该对象既可以捕获实例数据中的 3 ,也具有 .times() 方法。 - jfriend00
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Wander Nauta
OP想要的是能够正常工作的东西。我认为他们在这里使用“mock”的术语意味着他们想要复制.times()的工作方式。 - jfriend00
谢谢,这个可行!(虽然我为_.times =编写了一个新函数。(是的,“mocking”意味着复制此函数的工作方式;-)) - Seeven

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接