我想扩展数字类以包含odd
和even
等实例函数,以便我可以这样做:
2.odd() => false
2.even() => true
1.even() => false
1.odd() => true
扩展类是一种很好的Ruby实践:“Ruby check if even number, float”。
在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
我怎样才能让它发挥作用?语法错误让我觉得这不是JavaScript在基础层面上的工作方式。我最好的选择是扩展Math类并改为:
Math.odd(2) => false
Math.even(2) => true
Math.even(1) => false
Math.odd(1) => true
这似乎比2.odd()
更不优雅。
答案 0 :(得分:3)
我认为,只要你了解你的"扩展"的副作用。那你就没事了。我经常修改String原型来添加一个" elipsis"方法所以我可以做像
这样的事情"SomeString".elipsis()
但从一开始就开始。你没有"扩展课程"在JavaScript中。 JavaScript是一种基于原型的语言。您可以修改原型以满足您的需求。
您无法直接为数字本身添加方法。但是,您可以修改Number对象的原型:
Number.prototype.even = function(){
return this.valueOf() % 2 === 0;
}
有了这个,您将无法使用以下语法:
10.even();
但是,既然你不是硬编码的东西,否则你无论如何都不需要这个功能,你可以做到以下几点:
var a = 10;
a.even(); //true
我可能会说你可以考虑添加一个实用程序对象来做这些事情,因为修改原始原型并不总是保证是无副作用的。
此功能并不能为您带来任何好处。您正在检查奇数和偶数,用另一行替换一行代码。想想差异:
var a = 10;
var aIsEven = a.even();
VS
var a = 10;
var aIsEven = a % 2 === 0;
你获得了三个字符的代码,第二个选项不太可能破坏你的#34; JavaScript"。
答案 1 :(得分:2)
您可以使用(例如)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中扩展本机。 您可以阅读更多相关信息here
编辑:在JSFiddle上尝试我的代码后,Math
对象看起来没有prototype
,您可以read more about it here。 上面的代码无法使用!
相反,你可以这样做:
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 :(得分:1)
我想指出,这已经在数字课程中提供了。
只需使用布尔方法,奇怪吗?甚至?
2.odd?
=> false
2.even?
=> true
希望这有帮助。
无需创建新类,它已存在于数字类中。