【发布时间】:2016-06-08 17:49:31
【问题描述】:
请:只有纯原生 JS 代码。没有 jQuery 或其他外部的东西,谢谢。 :)
如何创建一个包含子函数但如果没有调用子函数也返回一个值的函数?
例如,我们取一个数字变量 num。
我想给 number 变量添加一个 round() 函数;如果直接调用,我希望它根据变量的实际值向上或向下舍入。
var num=4.12;
num.prototype.round=function(){return Math.round(this);}
现在我希望 round() 具有向上或向下舍入的子函数,而忽略十进制值。
num.prototype.round.up=function(){return Math.ceil(this);}
num.prototype.round.down=function(){return Math.floor(this);}
如果我这样做并将 num.round() 记录到控制台,它会做它应该做的事情。但是如果我将 num.round.up() 记录到控制台,我会收到一条错误消息,告诉我 num.round.up() 不是一个函数。
所以我尝试将子函数放入主函数声明中,如下所示:
num.prototype.round=function(){
var n=this;
this.up=function(){return Math.ceil(n);}
this.prototype.round.down=function(){return Math.floor(n);}
return Math.round(n);
}
然后,num.round() 将返回正确舍入的值,但 num.round.up() 和 num.round.down() 都会返回“不是函数”错误。
我想弄清楚这一点我快疯了……我不仅尝试了上面提到的方法,而且还尝试通过立即执行如下函数来做到这一点:
num.round=(function(){
return function(){
var that=this;
/* anything in here is already useless because this
is no longer num's value but [Object window]... */
}
})();
我想部分问题是我在 OOP 方面太弱了,以至于我对正确的术语一无所知......当然,这在寻找线索或了解任何潜力时都无济于事为什么这样的事情不应该工作的原因......
那么有什么办法可以做到这一点吗?
【问题讨论】:
-
您不能将 round 定义为一个函数,并且不能将其定义为一个包含两个函数(
up和down)的对象。 -
默认情况下,只有构造函数具有
prototype属性。4.12不是对象,更不是构造函数。 -
基本上,问题是当您调用
num.round.up时,this的值将是num.round函数,而不是num。那我不推荐这种方法。最好允许num.round接收一个可选参数,并将其命名为num.round()、num.round('up')或num.round('down')。 -
"那么有什么办法可以做到这一点吗?" - 是的,但不是一个好的或 OOP 的。
-
@Bergi 你能指出我正确的方向吗?我无意制作此功能或任何可继承的功能等等。它应该只在一个地方服务于一个目的。
标签: javascript function object methods