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

时间:2009-03-07 19:53:41

标签: javascript oop prototype methods

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

做这样的事情也有任何缺点(效率除外)吗?:

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

为了弄清楚,我理解像π这样的常量需要某个地方和函数应用于多个数字,如min / max。问题主要涉及只影响单个数字的方法,如圆形,abs,sin,pow等。

8 个答案:

答案 0 :(得分:20)

除了让其他人感到困惑之外,延伸Number.prototype没有任何缺点。重点是什么?使用value.round()代替Math.round(value)更好?

Math对象有几个很好的理由:

  1. 它也适用于非数字:Math.round("5")有效,而value.round()在值为字符串时不起作用(例如,文本框的值)
  2. Math对象的某些成员不属于“主要”数字值,例如Math.min()Math.max()。或者你想像a.max(b)
  3. 那样使用它
  4. 其他成员是全球性的,不属于专门的数字。例如Math.PI或函数Math.random()等常量。

答案 1 :(得分:19)

Math对象的原因很简单:“因为Java会这样做”。不是最好的理由,但我们在这里。我认为在道格拉斯·克罗克福德开始他的竞选活动以抑制一半语言*之前,事情变得更有意义了。最初你被“允许”或意味着做这样的事情:

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之间是否有任何真正的区别?

*在你激怒我之前:Crockford的评论不应该被认真对待。我同意他的观点,with在一个隐含的全球环境中是非常危险的。

答案 2 :(得分:13)

尝试123.round();

你的javascript控制台会给你的眼睛抛出几百个错误:P,nah ......

你可以这样做:

Number.prototype.x然后:(123).x();但永远不会123.x();

答案 3 :(得分:1)

我认为Math不仅仅是Number方法的集合。它的用途更广泛。比方说,使用NumberVariable.PI可能会令人困惑。与随机数生成相同。

另外我认为扩展数字是可以的,因为它是JS性质的一部分。如果我在这里错了,也许会有人纠正我。

答案 4 :(得分:1)

我相信这样调用也可以,因为Number的原型函数就像其他Object的原型函数一样工作:

5.5["round"]();
//should return 6

答案 5 :(得分:1)

所以,关于它是否是一个好主意的谈话,你可以做得很好。

您可以执行123.x()但js的解释器已损坏(因为它不会将点解释为消息调度)

奇怪的是,你可以使用123 .x()(在数字和点之间留一个空格)代替它,它会起作用。

123 ..也可以,但那是因为你有效地制作了小数,然后发送给它

  

(typeof 123.)==='number')// true

尝试:

  

Number.prototype.times = function(other){return this * other}; 3次(5);

在控制台中。

答案 6 :(得分:0)

我对此的看法是,如果您进行了正确的检查,不会覆盖本机功能,请了解本机命名标准,并使代码更易读,更易于管理,然后使代码更加方便。

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

AS使用它,因为javascript的性质,我相信最好的方法是:

  • 将数字包含在变量中而不是简单的静态值(最常见的情况)
    • nNum.round();
  • 在括号中包含简单的静态值:
    • (123).round();
  • 使用方括号表示法调用
    • 123 [ “圆”]()的调用;

答案 7 :(得分:0)

你可以这样做

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

https://www.w3schools.com/jsref/jsref_prototype_num.asp