javascript - 在 javascript 和 Math 对象中扩展 Number.prototype?

标签 javascript oop prototype methods

我一直想知道为什么 Javascript 有全局 Math 对象而不是为数字提供自己的方法。有充分的理由吗?

这样做还有什么缺点(除了效率之外)吗?:

Number.prototype.round = function(){
    return Math.round(this);
};

澄清一下,我知道像 π 这样的常数需要在某个地方以及应用于多个数字(例如最小值/最大值)的函数。问题主要是关于只影响单个数字的方法,例如 round、abs、sin、pow 等。

最佳答案

Math 对象的原因很简单:“因为 Java 就是这么做的”。这不是最好的理由,但我们就在这里。我想,在道格拉斯·克罗克福德 (Douglas Crockford) 开始压制一半语言*之前,当时的事情更有意义。最初你被“允许”,或者意味着,做这样的事情:

with (Math) {
  var n = min( round(a) * round(b), sqrt(c) );
  var result = exp( n + d );
}

扩展Number.prototype的缺点是其他人可能会做同样的事情。或者更糟糕的是,例如,将 Number.prototype.round 定义为对称舍入函数。

如果您正在寻找让生活更轻松的方法,为什么要止步于此呢?为什么不简单地将 Math 函数作为全局函数包含在内?

var m = 'abs acos asin atan atan2 ceil cos exp floor log max min ' +
        'pow random round sin sqrt tan PI').split(' ');
for (var i=0,l=m.length; i<l; i++) {
  window[ m[i] ] = Math[ m[i] ];
}

这会将所有数学函数放入全局范围,有效地允许您停止键入“Math”。问问自己:使用这些函数扩展 Number 和扩展 window 之间有什么真正的区别吗?

* 在你攻击我之前:克罗克福德的评论并不意味着被过于认真地对待。我确实同意他的观点,即 with 在隐式全局环境中非常危险。

关于javascript - 在 javascript 和 Math 对象中扩展 Number.prototype?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/622374/

相关文章:

javascript - 如何获得2个字符串之间的所有匹配项?

javascript - 使用 angular/karma/jasmine 模拟异步服务功能

c# - 如何获取/设置并不总是实现的接口(interface)的属性

c++ - “类形状”没有名为 ‘info’ 的成员,但添加一个也不起作用

javascript - 构造函数属性 : __proto__. constructor vs prototype.constructor

javascript - 如何在对象构造期间使用异步生成的值来分配属性?

javascript - 如果在选择列表 'b' 中选择了一个选择选项,如何从相同的选择列表 'c' 和 'a' 中删除该选项?

JavaScript 带参数函数的问题

design-patterns - 控制反转是否特定于 OO 语言?

Javascript 继承 : How prototype chain works between native prototypes