扩展数字等级

时间:2014-07-25 19:23:27

标签: javascript jquery ruby

我想扩展数字类以包含oddeven等实例函数,以便我可以这样做:

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 

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()更不优雅。

3 个答案:

答案 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

希望这有帮助。

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