我正在尝试制作一个可以同时应用于另一个函数返回的值的函数。由于这可能是一个糟糕的解释,因此下面是一个简化的示例:
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 this
和Mythical 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();
,因此对于this
,a.b.c();
中的this
为,而不是c()
。更多:You must remember b
和Mythical Methods