扩展数字等级
我想扩展数字类以具有odd
和even
等实例函数,所以我可以这样做:
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
希望这可以帮助。
无需创建新类,它已存在于数字类中。