Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/478.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何扩展内置类对象或数字的构造函数?_Javascript_Prototype_Primitive - Fatal编程技术网

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; }