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

问题描述:

所以下面的工作:Number.somepropertyormethod和Number()之间有什么区别somepropertyormethod?

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

但是,这并不工作:

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

此外,以下几项工作:

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

但是,这并不工作:

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

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

Number是一个构造对象。作为一个函数调用,它允许您创建新的数字实例。​​返回号码0。数字实例具有各种属性和方法,其中包括toString()toExponential()(例如)。语法的下面两个比特具有相同的含义:

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

Number对象也有其自身的性质。一个特殊的属性是prototype属性。这基本上是新数字实例的模板。在Number.prototype上存在的所有属性也存在于数字实例上。因此,我们可以相同的代码第三位添加到上述两个:

Number.prototype.toString.call(1); 

Number实例,但是,没有prototype属性,所以你不能访问Number().prototype。另一方面,它们具有constructor属性,该属性返回创建它们的对象,即Number对象。您可以在此访问prototype。因此,我们的代码相同的第四位:

Number().constructor.prototype.toString.call(1); 

希望这澄清了Number对象的数目和实例之间的关系。作为最后一个音符,所有上面的代码位是相同的这一点,显然是正确的方式来做到这一点:

(1).toString(); 

我相信你的例子Number是一个类,Number()是一个构造函数调用,它返回Number类的一个实例。

你可以试着检查下列各项:

​​

这是正常的,他们有不同的行为,他们的意思是不同的东西

这里有一些提示,你似乎很迷茫

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

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