整数原型

时间:2011-06-18 08:34:17

标签: javascript

如何制作整数原型?

Integer.prototype.num = function(dec){
    return number_format(this.toString(), dec);
}

3 个答案:

答案 0 :(得分:37)

JavaScript中没有Integer,只有Number。您可以按照展示的方式扩展Number

有两个阵营以这种方式扩展内置类型。一个阵营说这是邪恶的,你不能这样做;使用您传递对象的单独函数。另一个阵营说这就是为什么我们有原型,所以我们可以扩展我们认为合适的东西的功能。

如果你在第二阵营,有一些陷阱要避免(但请参阅下面的“世界正在改变......”)

  • 永远不会永远以这种方式扩展Object.prototype。你会打破大量的代码。
  • 非常非常谨慎地扩展Array.prototype,你会打破相当多的代码。

两种情况下的原因是,当您以这种方式扩展原型时,您将在原型上创建可枚举属性。这意味着它出现在for..in循环中。 JavaScript世界中的自定义和练习是必须在空白对象({})上没有可枚举的属性。数组可能更容易被接受,但要注意那些并不真正理解what for..in does的人会认为它会遍历数组索引;如果你以这种方式扩展Array.prototype,你就会打破他们的循环。 (我认为他们的循环已经被破坏了,但是把它放在一边......)

世界正在发生变化,因为ECMAScript5为我们提供了一种向对象添加不可枚举属性的方法,并且所有模糊的最新浏览器都实现了它。它被称为Object.defineProperty

Object.defineProperty(Number.prototype, "num", {
    enumerable: false,
    value: function() { ... }
});

请注意,enumerable: falsefalseenumerable的默认值;我在此明确强调这一点。这意味着它不会出现在for..in循环上,因此会使该参数变得柔和而不会扩展原生对象的原型。

但是,即使使用Object.defineProperty,命名冲突的可能性(其他代码也会扩展原型,或未来版本的JavaScript中添加的功能)仍然存在。

答案 1 :(得分:6)

Javascript没有整数类型(Integer)。仅浮点数(尝试typeof 3。返回Number)。

所以你可以使用类似的东西:

Number.prototype.myfunc = function() { }

附录

正如Felix Kling在评论中提到的,使用.prototype属性扩展内置对象的Javascript通常是一个好主意。新扩展名自动应用于此类型的所有对象 - 包括已实例化的对象以及将由您以外的代码创建的非对象。因此,它可能会干扰其他代码对Number对象的期望。

答案 2 :(得分:5)

Integer不是原生javascript对象。也许你的意思是为Number的原型添加格式化方法? 例如

var formatNum = function(format){
   return format === 'dec2'
           ? this.toPrecision(String(this).length+2)
           : format === 'div10'
           ? Number(this/10).toPrecision(2)
           : this;
}
Number.prototype.format = formatNum;
var num = 22;
num.format('dec2'); //=> 22.00
num.format('div10'); //=> 2.2