6

我需要一个在 JavaScript 的 Math 对象中计算任何底数的对数的方法。所以基本上我所做的是:

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

像这样扩展内置功能有什么缺点?

为了使我的情况更清楚,我正在接受用户输入并将其替换为适当的 Math 对象函数名称并将其传递给 eval 进行计算。如果不清楚,我的困境是,就我而言,我必须使用 eval (即使它是邪恶的)并且扩展 Math 对象函数最适合我的情况。

当我像这样扩展内置函数时,是否有可能出现一些奇怪的错误或其他错误,或者这是完全正常的事情吗?

4

2 回答 2

6

你不应该修改你不拥有的东西。

  • 如果您使用的另一个插件或 3rd 方代码添加了他们自己的log_bto版本Math,会提供完全不同的签名会怎样?

  • 如果未来版本的 JavaScript 定义了它自己的log_bon版本会Math怎样?

有人会哭,因为对于某人来说,它不会像他们期望的那样做。


我不确定为什么扩展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);}
于 2013-07-26T17:11:49.580 回答
0

您可以对其进行原型制作:

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

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

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

于 2013-07-26T17:12:46.567 回答