使用单例模式的JavaScript函数链接

使用单例模式的JavaScript函数链接,javascript,chaining,Javascript,Chaining,我有一小段代码,如下所示 var MY = MY || {}; MY.Farm = (function () { var add = function(x){ console.log(x) return this + this; }; return { add: function(x){ return add(x); } } }); 在一个单独的文件中,我创建了she

我有一小段代码,如下所示

var MY = MY || {};

MY.Farm = (function () {

    var add = function(x){
        console.log(x)
        return this + this;
    };

    return {
        add: function(x){
            return add(x);
        }

    }
});
在一个单独的文件中,我创建了
sheep
我的.Farm

var sheep = new MY.Farm()
我希望能够通过输出调用如下函数
6

sheep.add(3).add(2).add(1)
有什么办法可以做到这一点吗?需要对MY.Farm的
MY.Farm
代码段进行哪些更改才能适应此情况

提前谢谢。

像这样的东西

var MY = MY || {};

MY.Farm = (function () {
    var x=0;
    return {
        add: function(newX){
            if(typeof(newX) !="undefined") {
                x+=newX;
                return this;
            }
            return x;
       }
    }
});

var sheep = MY.Farm();
console.log( sheep.add(2).add(4).add());

你离得不远。诀窍是您需要跟踪某个地方的值,比如私有变量中的值,
add
需要返回
this
。最后,您需要一种在完成时获取值的方法:

MY.Farm = function () {
    var total = 0;

    return {
        add: function(x) {
          total += x;
          return this;
        },

        value: function() {
          return total;
        }
    };
};

var sheep = new MY.Farm();

sheep.add(3);
console.log(sheep.value()); // => 3

console.log(sheep.add(1).add(2).value()); // => 6

me认为添加var x;在My.Fram函数中,然后从创建sheep中删除“new”,x将作为隐藏变量保留在闭包中。在“添加”中,检查是否已设置x,并返回该值;为了允许答案使用+1链接,首先尝试了@Tero Tolonen answer,它马上就起作用了。所以我不得不接受他的建议。非常感谢你的回答。