以下是有效的:
alert(Number().toString.call(1));
但这不起作用:
alert(Number.toString.call(1));
此外,以下作品:
alert(Number.prototype.constructor(1));
但这不起作用:
alert(Number().prototype.constructor(1));
为什么我们在第一个例子中需要使用数字后面的括号,为什么我们必须省略第二个例子中的括号?
答案 0 :(得分:2)
您可以尝试检查以下内容:
alert(typeof Number());//number
alert(typeof Number);//function
他们有不同的行为是正常的,他们意味着不同的事情
答案 1 :(得分:2)
Number
是构造函数对象。作为一个函数,它允许您创建新的数字实例。 Number()
返回号码0
。数字实例具有各种属性和方法,包括toString()
和toExponential()
(例如)。以下两位语法具有相同的含义:
Number().toString.call(1);
(0).toString.call(1);
Number
对象也有自己的属性。一个特殊属性是prototype
属性。这基本上是新数字实例的模板。 Number.prototype
上存在的所有属性也存在于数字实例上。所以我们可以在上面两个中添加第三位相同的代码:
Number.prototype.toString.call(1);
但是,数字实例没有prototype
属性,因此您无法访问Number().prototype
。另一方面,它们具有constructor
属性,该属性返回创建它们的对象,即Number对象。然后,您可以访问此prototype
。所以我们的第四个相同的代码:
Number().constructor.prototype.toString.call(1);
希望这澄清了Number
对象和数字实例之间的关系。作为最后一点,所有上述代码都与此相同,这是明显正确的方法:
(1).toString();
答案 2 :(得分:0)
我相信你的例子Number是一个类,而Number()是一个构造函数调用,它返回Number类的一个实例。
答案 3 :(得分:0)
以下是一些提示,你似乎很困惑
// So the following works, you're calling the toString Method of Number.prototype
// and passing 1 as its context
alert(Number().toString.call(1));
// But this does not work:
// Number (the constructor) does not have property called toString, FAIL
alert(Number.toString.call(1));