参见英文答案 >
javascript: do primitive strings have methods?2个
如果我们像这样向Number函数(或Boolean或String)添加一个方法
如果我们像这样向Number函数(或Boolean或String)添加一个方法
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在内部被视为’Number’对象.这让我更加困惑.
typeof num1 === "number" // returns false typeof num2 === "number" // returns true typeof num1 === "object" // returns true typeof num2 === "object" // returns false
这不是说num2不是“对象”吗?
如果它不是“对象”那么它怎么可能是’Number’的实例呢?
解决方法
基本类型Number具有相应的对象表示,您可以使用新的Number创建该表示.这是一个对象,因此与基本类型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