为什么在JavaScript中Math对象不需要使用new关键字?

3

我知道在javascript中,Math是一个对象,然而在这本书中它说当使用Math对象时,我们不需要使用new关键字。例如:

var pi = Math.PI;
alert(pi);

我想知道为什么它不需要,而在其他对象中,比如Date,它需要使用new关键字。


请参见 https://dev59.com/8HRC5IYBdhLWcg3wFdBx - JamesENL
4个回答

4
Math是 ECMAScript 中隐式全局对象的一个属性名,它是一个普通的 JavaScript 对象,类型为Math(通过给这个单一实例分配属性来定义,类似于 JSON 的工作方式)。这在规范中有详细记录:http://www.ecma-international.org/ecma-262/5.1/#sec-15.8 可以将 Math 对象视为以下内容:
// within the "global" context:
var Math = {
    PI: 3.14,
    sin: function(x) { ... },
    cos: function(x) { ... }
};

请注意,没有定义构造函数(也未定义Call),因此表达式new Math()是无意义且未定义的。如果有定义,它将如下所示:
function Math() {
    this.PI = 3.14;
    this.sin = function(x) { ... };
    this.cos = function(x) { ... };
};
var Math = new Math();

我还要补充一点,创建多个Math实例的Math构造函数是没有意义的,因为构造函数在我们希望每个实例都有自己的状态时非常有用;就像每个Person都有一个独特的姓名和地址。数学表达式有一个特定的定义(你不能改变PI的值),而且你不能改变它们的定义。这就是为什么我认为Math对象被实现为单例的原因。基本上,Math就是_数学_,所以拥有多个Math就是同样的事情,为什么不只有一个呢? - istos

4
typeof Math -->    "object"
typeof Date -->    "function"

数学是一个对象,日期是构造函数。

new 关键字用于使用构造函数初始化实例,而不是使用对象。


1
新关键字用于处理构造函数。 Math是一个全局对象,已经被实例化。

0
当您调用new Date([可选参数])时,您创建了一个新的Date函数实例,该实例存储特定于此实例(日期和时间)的数据。 Math不需要存储任何实例特定数据,因为PI不会改变,所有Math函数(如sincosmax等)始终执行相同的操作。这就是为什么Math存在作为静态对象(像其他语言中的静态类)的原因。没有必要创建此对象的新实例,您可以在任何地方使用相同的实例。顺便说一句,Date也有静态方法,例如Date.parse()。您不需要创建新的Date来使用此方法。您可以像调用Math.cos(x)一样调用它,只需Date.parse('2014-11-04')即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接