整数原型

cla*_*rkk 13 javascript

你如何在整数上制作原型?

Integer.prototype.num = function(dec){
    return number_format(this.toString(), dec);
}
Run Code Online (Sandbox Code Playgroud)

T.J*_*der 38

Integer只是在JavaScript中没有Number.您可以Number按照您展示的方式进行扩展.

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

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

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

两种情况下的原因是,当您以这种方式扩展原型时,您将在原型上创建一个可枚举的属性.这意味着它显示在for..in循环中.JavaScript世界中的自定义和实践是空白对象()上必须没有可枚举的属性{}.阵列可能更受欢迎,但要小心的人谁不真正了解什么for..in谁想到它会遍历数组索引; 如果你Array.prototype以这种方式延伸,你将打破他们的循环.(我认为他们的循环已经被破坏了,但是把它放在一边......)

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

Object.defineProperty(Number.prototype, "num", {
    enumerable: false,
    value: function() { ... }
});
Run Code Online (Sandbox Code Playgroud)

请注意enumerable: false(false默认为enumerable;我在此明确强调).这意味着它不会显示在for..in循环上,因此可以软化该参数以防止扩展本机对象的原型.

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


nim*_*odm 6

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

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

Number.prototype.myfunc = function() { }
Run Code Online (Sandbox Code Playgroud)

附录

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

  • 不,它在没有构造函数的情况下工作正常:`Number.prototype.myfunc = function() {console.log(42)}; a = 5;a.myfunc() // 42`。实际上使用 `Number()` 会产生各种其他问题。 (2认同)
  • 您无需使用构造函数即可使用 `Number` 方法。`(10).toString()` (2认同)

Koo*_*Inc 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
Run Code Online (Sandbox Code Playgroud)