[英]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
对象有几个很好的理由:
Math.round("5")
有效,而value.round()
在值为字符串时不起作用(例如,文本框的值) Math.min()
或Math.max()
。 或者你想像a.max(b)
一样使用它吗? 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,我认为最好的方法是:
你可以这样做
Number.prototype.round = function() {
return Math.round(this.valueOf());
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.