如何制作整数原型?
Integer.prototype.num = function(dec){
return number_format(this.toString(), dec);
}
答案 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: false
(false
是enumerable
的默认值;我在此明确强调这一点。这意味着它不会出现在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