在JavaScript中,是否可以有一系列包含参数的键值函数?

在JavaScript中,是否可以有一系列包含参数的键值函数?,javascript,syntax,functional-programming,prototype,javascript-objects,Javascript,Syntax,Functional Programming,Prototype,Javascript Objects,我有一个javascript函数,其中包含一组变量: var mainFunction = function(){ this.var1 = null; this.var2 = null; } 有没有办法将主函数设置为包含子函数,从而允许我通过点表示法修改这些实例变量,如下所示 mainFunction.output() // null, null mainFunction.changeVar1("foo"

我有一个javascript函数,其中包含一组变量:

var mainFunction = function(){
    this.var1 = null;
    this.var2 = null;
}
有没有办法将主函数设置为包含子函数,从而允许我通过点表示法修改这些实例变量,如下所示

mainFunction.output()                                      // null, null
mainFunction.changeVar1("foo").output()                    // foo, null
mainFunction.changeVar2("bar").output()                    // null, bar
mainFunction.changeVar1("foo").changeVar2("bar").output()  // foo, bar
或者(尽管我怀疑可能):


以下是您需要的:

function sample() {

    function chart() {
        this.var1 = null;
        this.var2 = null;
    }

    chart.output = function (_) {
        console.log("output: ", var1, var2);
        return chart;
    };

    chart.changeVar1 = function (_) {
        if (!arguments.length) return var1;
        var1 = _;
        return chart;
    };

    chart.changeVar2 = function (_) {
        if (!arguments.length) return var2;
        var2 = _;
        return chart;
    };

    return chart;
}
new sample().changeVar1(13).changeVar2(1986).output(); // output: 13 1986


由于这种方法使用方法链接,因此每次函数调用都会返回实例,您可以使用该实例进一步调用类的其他方法。

如果您可以访问“this”,则可以直接修改它。这不是每次调用原型方法时都会返回一个新的
mainFunction
实例吗?我相信August正在寻找一种在同一实例上实现方法链接的方法。@srvikram13如果是这样,那么问题中的示例案例必须更改。
var mainFunction = function(var1, var2) {
    this.var1 = var1 || null;
    this.var2 = var2 || null;
};

mainFunction.prototype.output = function() {
    console.log(this.var1, this.var2);
};

mainFunction.prototype.changeVar1 = function(value) {
    return new mainFunction(value, this.var2);
};

mainFunction.prototype.changeVar2 = function(value) {
    return new mainFunction(this.var1, value);
};

var mfunc = new mainFunction();

mfunc.output()                                      // null, null
mfunc.changeVar1("foo").output()                    // foo, null
mfunc.changeVar2("bar").output()                    // null, bar
mfunc.changeVar1("foo").changeVar2("bar").output()  // foo, bar
mfunc.changeVar2("bar").changeVar1("foo").output()  // foo, bar  
function sample() {

    function chart() {
        this.var1 = null;
        this.var2 = null;
    }

    chart.output = function (_) {
        console.log("output: ", var1, var2);
        return chart;
    };

    chart.changeVar1 = function (_) {
        if (!arguments.length) return var1;
        var1 = _;
        return chart;
    };

    chart.changeVar2 = function (_) {
        if (!arguments.length) return var2;
        var2 = _;
        return chart;
    };

    return chart;
}
new sample().changeVar1(13).changeVar2(1986).output(); // output: 13 1986