2016-02-28 73 views
6

如果我们添加了一个方法,以数函数(或布尔或字符串)这样为什么一个原始变量就像一个对象?

Number.prototype.sayMyNumber = function(){ 
    return "My number is " + this; 
} 

,然后创建若干对象将其分配给一个变量

var num1 = new Number(34); 
num1.sayMyNumber(); // it says "My number is 34" 

这是精细和预期,因为我们创建'Number'对象。

同样,如果我要创建一个原始变量

num2 = 34; 
num2.sayMyNumber(); // it says "My number is 34" 

出人意料的是,NUM2也有一个方法sayMyNumber(),即使我们没有明确创建一个Number对象。

然后我试图像这样,

34.sayMyNumber(); // error, this does not work 

为什么NUM2工作?

更新

这是一个后续问题,我问在注释部分,我把它这里更好的可视性

下面的答案提到NUM2被认为是一个“数'内部对象。这使我更加困惑。

typeof num1 === "number" // returns false 
typeof num2 === "number" // returns true 

typeof num1 === "object" // returns true 
typeof num2 === "object" // returns false 

这不是说num2不是“对象”吗? 如果它不是一个“对象”,那么这怎么会是“数字”的实例?

+2

在'34.sayMyNumber()'点被视为导致错误的**小数点**。如果你想在这种情况下强制方法调用,你必须使用parens。 'num2'工作原因导致JS中的任何数字都是'Number'实例,即使它被定义为文字 – hindmost

+0

甚至当我像这样写'(2).sayMyNumber()'时它也不起作用。不知道这是否与上面 –

+0

一样诚实(whatever_number).yourFunction()的作品 –

回答

-3

对于这两种,

var num1 = new Number(34); 
num2 = 34; 

要分配"Number"类型值都num1num2变量。所以它称为原型,它连接到"Number"

但调用34.sayMyNumber有语法错误和非法的声明。

如果任何人有这个问题请参考... https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number

+0

有人可以解释为什么downvotes?如果在这里出现错误,我会修复... –

+1

'num1'和'num2'确实有不同的类型。 – Bergi

+0

我已经提到了类型值...并且mozillaa说“正在创建的对象的数值...”新的Number(value); 如果参数不能转换为数字,则返回NaN。 在非构造函数上下文中(即没有new运算符),可以使用Number来执行类型转换... https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/ Global_Objects/Number ... –

-3

JavaScript的基元和对象之间的要挟。在这种情况下,数字值被强制转换为Number对象,以便访问该原型方法sayMyNumber。实际上,通过这种方式,原语可以访问由它们各自的对象构造函数定义的所有属性和方法。但是,它们与对象不同,因为它们是不可变的。

因此,(34).sayMyNumber();作品;这样做(34).toFixed()(34).toPrecision()

至于34.sayMyNumber();,作为最后面指出的那样,是一个语法错误。

+1

数字肯定不会像对象一样对待。 – Bergi

3

原始类型数字具有相应的对象表示形式,您可以使用new Number创建对应的对象表示形式。这是一个对象,因此与原始类型数字数据类型不同。

如果您致电Number(34)(不含new),则不会创建对象,但Number函数会执行类型转换,以实现原始数值。

var num1 = new Number(34); // object 
var num2 = 34; // primitive 

当您在原始数num2拨打sayMyNumber(),JavaScript的内部转换原始暂时为其等效的对象版本。并且因为您添加了sayMyNumber()Number.prototype您可以访问此功能。

原因34.sayMyNumber()不起作用是因为当JavaScript引擎解析你的源代码时,它必须解释一个点在给定上下文中的含义。在34.sayMyNumber()的情况下,点可能不明确。这是否意味着小数点分隔符?或者它是否意味着对象成员访问? JavaScript选择将所有整数后面跟一个点解释为表示浮点数的一部分。但是由于没有这样的数字34.sayMyNumber(),它会引发一个SyntaxError。 Read more here

+0

当typeof不同时,它们如何相同?typeof num1 =“object”和'typeof num2 =“number”? –

+0

您是不是指'var num1 = Number(34)'。一个'Number'不是一个对象,所以'new'没有意义。 – doug65536

+0

你是对的@ doug65536。我只是复制了OP的代码行,并没有想到'new'。 – swenedo

相关问题