Javascript 整数原型
如何在整数上制作原型Javascript 整数原型,javascript,Javascript,如何在整数上制作原型 Integer.prototype.num = function(dec){ return number_format(this.toString(), dec); } JavaScript中没有整数,只有数字。您可以按显示的方式扩展编号 关于以这种方式扩展内置类型,有两个阵营。一个阵营说这是邪恶的,你不能这样做;使用将对象传递到的单独函数。另一个阵营说这正是我们拥有原型的原因,这样我们就可以扩展我们认为合适的功能 如果你在第二个阵营,有陷阱需要避免(但请参阅下面
Integer.prototype.num = function(dec){
return number_format(this.toString(), dec);
}
JavaScript中没有整数,只有数字。您可以按显示的方式扩展编号 关于以这种方式扩展内置类型,有两个阵营。一个阵营说这是邪恶的,你不能这样做;使用将对象传递到的单独函数。另一个阵营说这正是我们拥有原型的原因,这样我们就可以扩展我们认为合适的功能 如果你在第二个阵营,有陷阱需要避免(但请参阅下面的“世界正在改变…”):
- 永远不要用这种方式扩展
。您将破坏大量代码Object.prototype
- 非常非常小心扩展
,您将破坏相当多的代码数组。prototype
{}
)上必须没有可枚举属性。数组可能更容易接受,但要小心那些不太了解的人,他们认为它会循环遍历数组索引;如果您以这种方式扩展Array.prototype
,您将打破它们的循环。(我会说他们的线圈已经断了,但把它放在一边……)
不过,世界正在发生变化,因为它为我们提供了一种向对象添加不可枚举属性的方法,而所有模糊的最新浏览器都实现了这一点。它被称为对象。defineProperty
:
Object.defineProperty(Number.prototype, "num", {
enumerable: false,
value: function() { ... }
});
请注意,enumerable:false
(false
是enumerable
的默认值;我在这里明确强调这一点)。这意味着它不会出现在循环中的for..in中,从而软化了反对扩展本机对象原型的论点
但是,命名冲突的可能性仍然存在(其他代码也扩展了原型,或者在未来的JavaScript版本中添加了功能),即使使用对象也是如此。defineProperty
JavaScript没有整数类型(Integer
)。仅浮点数(请尝试typeof 3
。返回Number
)
因此,您可以使用以下内容:
Number.prototype.myfunc = function() { }
补遗
正如Felix Kling在评论中提到的,使用.prototype
属性扩展Javascript内置对象通常不是一个好主意。新的扩展将自动应用于此类型的所有对象,包括已实例化的对象和将由代码(而不是您的代码)创建的非对象。因此,它可能会干扰其他一些代码对Number对象的期望。Integer
不是本机javascript对象。也许您的意思是向Number
的原型添加一个格式化方法?例如:
JavaScript只有编号
。扩展内置对象的原型在一般情况下不是一个好主意。它被称为“猴子补丁”,被认为是不好的做法。如果没有构造函数,它可以正常工作:Number.prototype.myfunc=function(){console.log(42)};a=5;a、 myfunc()//42
。实际上使用Number()
会产生各种其他问题。您不需要使用构造函数就可以使用Number
方法<代码>(10).toString()
@Felix和CD:已更正。很抱歉,谢谢你的评论。
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