我该如何在JavaScript中向Math对象添加方法?

6
我需要在JavaScript的Math对象中找到一个方法,用于计算任意底数的对数。所以基本上我做的是这样的:
Math.log_b=function(b,x){return Math.log(x)/Math.log(b);}

扩展内置函数是否有缺点?
为了更清楚我的情况,我正在获取用户输入并将其替换为适当的Math对象函数名称,并将其传递给eval进行计算。如果这不清楚,我的困境是,在我的情况下,我必须使用eval(即使它很危险),扩展Math对象函数最适合我的情况。
当我这样扩展内置函数时,是否存在某些奇怪的错误或其他问题,还是这是完全正常的事情?

没有Math()构造函数,因此您无法将其原型化。数学函数只是函数,而不是对象的方法。 - Iron3eagle
是的,它无法进行原型设计。 - Jack_of_All_Trades
@Jack_of_All_Trades 是的,它可以被原型化。请看我的回答。 - Naftali
2个回答

7

你不应该修改你没有所有权的内容。

  • 如果另一个插件或第三方代码添加了自己版本的log_bMath,并提供了完全不同的签名,会发生什么?

  • 如果未来的JavaScript版本在Math上定义了它自己的log_b版本会发生什么?

有人会哭泣,因为对于某些人,它不会按照他们的期望工作。


我不确定为什么扩展Math最适合您的情况

function my_log_b(b,x){return Math.log(x)/Math.log(b);}

... 仍然适合您的情况。更好的方法是定义自己的命名空间,并将其放在其中;

var ME = {};

ME.log_b = function (b,x){return Math.log(x)/Math.log(b);}

0

你可以进行原型设计:

if (Math.__proto__) {
    Math.__proto__.log_b=function(b,x){ return this.log(x) / this.log(b); }
}
else {
    alert('Cannot prototype `Math`');
}

但这可能不是最好的想法,因为您可能会覆盖浏览器代码。

最好将此方法添加到您自己创建的对象中。


我不确定这怎么回答问题?他已经向 Math 添加了自己的方法(它可以在 http://jsfiddle.net/QnUsf/ 上工作),他是在问这样做是否可以,对吗? - Matt
1
你是对的;你的代码在IE浏览器中无法工作,因为该浏览器不支持非标准的__proto__,而他的可以:P。 - Matt
@Matt 噫 :-P 这在不好的浏览器中可能是真的 :-P - Naftali
算了,我会取消我的踩赞,但你真的不需要首先创建原型;Math是一个活生生的对象,你可以直接(通用地)添加方法。 - Matt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接