扩展数字等级

我想扩展数字类以具有oddeven等实例函数,所以我可以这样做:

 2.odd() => false 2.even() => true 1.even() => false 1.odd() => true 

扩展类是一个很好的Ruby实践:“ Ruby检查是否偶数,浮动 ”。

在JavaScript中是一样的,还是会导致性能问题或其他一些问题?

无论如何,尽管我付出了最大的努力,但我无法延伸:

 var NumberInstanceExtensions = { accuracy: function(){ return 'This is cool ' + this } } $.extend(Number.prototype,NumberInstanceExtensions); alert( $.type(5) ); //-> number //alert( 5.accuracy() ); //-> Uncaught SyntaxError: Unexpected token ILLEGAL 

http://jsfiddle.net/VLPTb/2/

我怎样才能让它发挥作用? 语法错误让我觉得这不是JavaScript在基础层面上的工作方式。 我最好的选择是扩展Math类并改为:

 Math.odd(2) => false Math.even(2) => true Math.even(1) => false Math.odd(1) => true 

这似乎比2.odd()更不优雅。

我想只要你了解你的“扩展”的副作用,那么你就可以了。 我经常修改String原型来添加“elipsis”方法,所以我可以做类似的事情

 "SomeString".elipsis() 

但从一开始就开始。 你不是在JavaScript中“扩展类”。 JavaScript是一种基于原型的语言。 您可以修改原型以执行您需要的操作。

您将无法直接向数字本身添加方法。 但是,您可以修改Number对象的原型:

 Number.prototype.even = function(){ return this.valueOf() % 2 === 0; } 

有了这个,您将无法使用以下语法:

 10.even(); 

但是,既然你不是硬编码的东西,否则你不需要这个function,你可以做以下事情:

 var a = 10; a.even(); //true 

我可能会说你可以考虑添加一个实用程序对象来做这些事情,因为修改原始原型并不总能保证是无副作用的。

此function并不能为您带来任何好处。 你正在检查奇数和偶数,用另一行替换一行代码。 想想差异:

 var a = 10; var aIsEven = a.even(); 

VS:

 var a = 10; var aIsEven = a % 2 === 0; 

您获得了三个字符的代码,第二个选项不太可能破坏您的“JavaScript”。

可以使用(例如) Number.prototype.myFn = function(){}扩展本机JS对象。

所以你可以这样做:

 Math.prototype.odd = function(n){ return n % 2 === 0; }; Math.prototype.even = function(n){ return n % 2 === 1; }; 

然后像这样使用它:

 var two = 2; console.log(Math.odd(2)); // true 

但我强烈建议您不要在JavaScript中扩展本机。 你可以在这里阅读更多相关信息

编辑 :在JSFiddle上尝试我的代码后,看起来Math对象没有prototype ,你可以在这里阅读更多相关信息 。 上面的代码不起作用!

相反,你可以这样做:

 Math.odd = function(n){ return n % 2 === 0; }; Math.even = function(n){ return n % 2 === 1; }; console.log(Math.odd(2)); // true 

要么 :

 Number.prototype.odd = function(){ return this % 2 === 0; }; Number.prototype.even = function(){ return this % 2 === 1; }; console.log(new Number(2).odd()); // true 

我想指出,这已经在数字课程中提供了。

只需使用布尔方法,奇怪? 乃至?

 2.odd? => false 2.even? => true 

希望这可以帮助。

无需创建新类,它已存在于数字类中。