Javascript 如何扩展内置类对象或数字的构造函数?
假设我想让所有数字在生成后都有属性Javascript 如何扩展内置类对象或数字的构造函数?,javascript,prototype,primitive,Javascript,Prototype,Primitive,假设我想让所有数字在生成后都有属性foo,例如,包含它们值的两倍。我想做 // extend Number constructor here. console.log(5.foo); // outputs 10 您是如何做到的?您需要扩展原型: Number.prototype.foo = function(){ return this*2; } 虽然这是一个方法,但不是成员。 num=2; num.foo()//返回4您不扩展构造函数,而是扩展原型,通过在其上使用“getter”: 为什么
foo
,例如,包含它们值的两倍。我想做
// extend Number constructor here.
console.log(5.foo); // outputs 10
您是如何做到的?您需要扩展原型:
Number.prototype.foo = function(){
return this*2;
}
虽然这是一个方法,但不是成员。
num=2;
num.foo()//返回4您不扩展构造函数,而是扩展原型,通过在其上使用“getter”: 为什么第一个示例
1.foo
失败?JS解析器一旦看到点,就需要一个小数部分。这是没有办法的。所以你必须满足于说1.0.foo
但是1.0是原语而不是对象,对吗?那么,1.0.foo
怎么可能工作呢?因为JavaScript将在必要时强制(强制转换或转换)原语到对象。在这种情况下,数值被强制为一个number对象,其长度刚好足以计算foo
的值,之后该对象被丢弃(通过垃圾收集)
您可能还想实现setter,如中所示
set: function(v) { this = v/2; }
但这当然是无效的;我们无法设置此!!而且无法访问[[PrimitiveValue]]
对象下的[/code>来设置它
我不推荐使用上述方法,以这种方式扩展内置类型并不是最佳实践。这最好放在异国情调的领域。数字是原语。如果你创建了一个对象,你就可以做到,但为什么呢?我不知道这是否可能,但这可能是一个非常糟糕的主意。想象有人在读你的代码,看到某处使用了number.foo
变量,该变量神奇地是数字的两倍。如果您编写一个像valuetweeth(num)
这样的方法,它的可读性不是更高吗?不要扩展基元对象,这是一个非常糟糕的主意。@elclars您的意思是,我只能在重写数字然后使用var num=new Number(5)的情况下才能这样做代码>。有道理。我希望做console.log(5.foo);/输出10
。准确地说,将添加原型函数描述为“覆盖”是不正确的。这是“扩展”。但不可能实现5.px?你也可以实现1..foo
,但这看起来更奇怪
set: function(v) { this = v/2; }