我正在尝试创建一个可以应用于函数内另一个函数返回的值的函数。由于这可能是一个可怕的解释,这里有一个简化的样本:
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
这不正是我正在做的事情,使用简单的乘法更容易理解。
答案 0 :(得分:2)
这是尽可能接近:
function foo(n){
this.value = n;
return this;
};
foo.prototype = {
valueOf : function(){
return this.value;
},
multiplyBy : function(n){
return new foo(this.value * n);
}
};
foo.prototype.toString = foo.prototype.valueOf;
var x = new foo(2);
var y = x.multiplyBy(2).multiplyBy(2).multiplyBy(2);
// y == 16
答案 1 :(得分:1)
更新:
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)
注意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
,因此乘法的结果是NaN
。
请记住,在JavaScript中,this
完全由如何调用函数定义,而不是定义函数。当您通过点符号(a.b();
)调用函数时,您正在查找属性的对象在函数调用中变为this
,因此使用a.b.c();
,{{1} } this
内的c()
是b
,而不是a
。更多:You must remember this
和Mythical Methods