Number.somepropertyormethod和Number()之间有什么区别.somepropertyormethod?

时间:2011-06-09 21:57:17

标签: javascript

以下是有效的:

alert(Number().toString.call(1));

但这不起作用:

alert(Number.toString.call(1));

此外,以下作品:

alert(Number.prototype.constructor(1));

但这不起作用:

alert(Number().prototype.constructor(1));

为什么我们在第一个例子中需要使用数字后面的括号,为什么我们必须省略第二个例子中的括号?

4 个答案:

答案 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)

以下是一些提示,你似乎很困惑

  • 构造函数(Number)没有名为toString的属性。它有一个名为prototype的属性,如果在对象本身中没有定义属性,它允许实例查看该对象。
  • Number()返回一个实例,它通过原型链(来自Number.prototype.toString)有一个名为toString的属性。那些实例没有原型属性

// 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));