如果我们将一个方法添加到数字函数(或布尔或字符串),就像这样
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不是"对象" ? 如果它不是"对象"那怎么可能是' Number' ?
答案 0 :(得分:3)
基本类型 Number 具有相应的对象表示,您可以使用new Number
创建该表示。这是对象,因此与基本类型 Number 的数据类型不同。
如果您致电Number(34)
(没有new
),则不会创建对象,但数字函数会执行类型转换,而不是原始数字值。
var num1 = new Number(34); // object
var num2 = 34; // primitive
当您在原始编号sayMyNumber()
上调用num2
时,JavaScript会在内部将原始内容临时转换为其等效对象版本。由于您已将sayMyNumber()
添加到Number.prototype
,因此您可以访问该功能。
34.sayMyNumber()
不起作用的原因是因为当JavaScript引擎解析您的源代码时,它必须解释一个点在给定上下文中的含义。在34.sayMyNumber()
的情况下,点可能是模糊的。它是指小数分隔符吗?或者它是否意味着对象成员访问? JavaScript选择解释所有整数,后跟一个点作为浮点数的一部分。但由于没有这样的数字34.sayMyNumber(),它会引发一个SyntaxError。 Read more here
答案 1 :(得分:-2)
JavaScript在基元和对象之间强制执行。在这种情况下,数值被强制转换为Number
对象,以便访问原型方法sayMyNumber
。实际上,通过这种方式,基元可以访问由它们各自的对象构造函数定义的所有属性和方法。但是,它们与对象不同,因为它们是不可变的。
因此,(34).sayMyNumber();
有效; (34).toFixed()
或(34).toPrecision()
也是如此。
至于34.sayMyNumber();
,正如最后指出的那样,是语法错误。
答案 2 :(得分:-3)
对于两者,
var num1 = new Number(34);
num2 = 34;
您要为"Number"
和num1
变量分配num2
类型值。所以它调用原型,它附加到"Number"
。
但是调用34.sayMyNumber
有语法错误,这是非法的声明。
如果有人对此有疑问,请参阅... https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number