我正在尝试制作一个可以同时应用于另一个函数返回的值的函数。由于这可能是一个糟糕的解释,因此下面是一个简化的示例:

function MainFnc() {
    this.subFnc=function(a) {
        return a*2
    }
    this.subFnc.subSubFnc=function(a) {
        return this*a
    }
}


这不是我的实际代码,这是一个比乘数字好得多的原因。这只是我要实现的目标的简化示例。我的问题是,实际上是否有可能更深入,如果可以,那么如何?我在此示例代码中描述的方法显然不起作用。

谢谢你的帮助。

编辑:这是一个正在使用的示例,因为不是每个人都清楚地知道我要怎么做:

anObject=new MainFnc;
alert(anObject.subFnc(2)); //returns 4
alert(anObject.subFnc(2).subSubFnc(2); //returns 8


这并不是我正在做的事情,使用简单的乘法更容易理解。

最佳答案

根据您的评论进行更新:


  MainFnc是在变量(即MainVar)中创建的对象。因此,如果我想尝试MainVar.subFnc(2),它将返回4。但是,如果我想尝试MainVar.subFnc(2).subSubFnc(2),它将返回8


现在,您要从subFnc返回一个数字,因此表达式MainVar.subFnc(2).subSubFnc(2)会像这样分解:


subFnc上查找属性MainVar;它返回一个函数引用。
this = MainVar调用函数;这将返回数字2
在数字subSubFnc上查找属性2;它返回undefined
this = 2调用函数;失败,因为您不能将undefined作为函数调用。


更多:You must remember thisMythical Methods

要执行您的操作,必须使subFnc返回具有函数属性的对象。您可以这样:

function MainFnc(val) {
    this.value = val;

    this.mult=function(a) {
        return new MainFnc(this.value * a);
    };

    this.div=function(a) {
        return new MainFnc(this.value / a);
    };

    this.get = function() {
        return this.value;
    };
}


...然后这样称呼它:

var MainVar = new MainFnc(3);
alert(MainVar.mult(3).mult(4).div(6).get()); // alerts "6" (3 * 3 * 4 / 6 = 6)


Live example

请注意get函数以返回基础数字。您还可以添加toString

this.toString = function() {
    return String(this.value);
};


但是上面的代码根本没有利用原型继承(这对您创建所有这些对象非常重要;我们需要使它们保持轻量级);您可能会考虑:

function MainFnc(val) {
    this.value = val;
}
MainFnc.prototype.mult = function(a) {
    return new MainFnc(this.value * a);
};
MainFnc.prototype.div = function(a) {
    return new MainFnc(this.value / a);
};
MainFnc.prototype.get = function() {
    return this.value;
};
MainFnc.prototype.toString = function() {
    return String(this.value);
};




原始答案:

使用该代码,如果您这样做:

var f = new MainFnc();
alert(f.subFnc(3));           // alerts "6"
alert(f.subFnc.subSubFnc(3)); // NaN


...因为在this内的subSubFnc像这样被调用时是subFnc,并且乘以一个函数引用会尝试将其转换为一个数字,该数字来自NaN,因此相乘的结果为。

请记住,在JavaScript中,NaN完全由调用函数的方式定义,而不是由定义函数的位置定义。当您通过点分符号(this)调用函数时,要在其上查找属性的对象将在函数调用内变为a.b();,因此对于thisa.b.c();中的this为,而不是c()。更多:You must remember bMythical Methods

09-25 18:13