繁体   English   中英

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

[英]Extending Number.prototype in javascript and the Math object?

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

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

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

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

除了混淆其他人之外,扩展Number.prototype没有任何缺点。 重点是什么? 使用value.round()而不是Math.round(value)什么value.round()

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

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

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

*在你激怒我之前:克罗克福德的评论并不意味着太过认真。 我同意他的观点with即在一个隐含的全球环境中非常危险。

尝试做123.round();

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

你可以做:

Number.prototype.x then: (123).x(); 但从来没有123.x();

那么,关于它是否是一个好主意的谈话,你可以做到这一点。

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

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

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

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

尝试:

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

在控制台中。

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

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

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

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

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

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

由于javascript的性质,使用它的AS,我认为最好的方法是:

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

你可以这样做

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM