数学不是构造函数,但它有

时间:2016-11-22 21:09:02

标签: javascript constructor

这是一个我无法弄清楚的技巧问题。当我从MDN读取时,我们无法从Math创建实例。运行new Math()将产生异常Math is not a constructor。但是Math在Math.constructor内有自己的属性。是的Object类型,但我们可以运行它Math.constructor()。但即使我们通过exec Math.constructor = Function.constructor重新定义它,它也会抛出异常。

现在我脑子里有一些假设:

  • 构造函数包含一个隐藏属性,浏览器引擎拒绝调用它。
  • 构造函数解释为浏览器引擎中的特殊c ++对象,其中索引位于" TypeError:不是构造函数"采集。

有人可以彻底回答我为什么构造函数存在但我无法创建实例吗?

提前致谢。

2 个答案:

答案 0 :(得分:2)

引用自己的答案是

  

因为规范是这样说的

spec says

  

数学对象

     

Math对象是一个具有一些命名属性的对象,   其中一些是功能。

     

Math对象的[[Prototype]]内部属性的值是   标准的内置Object原型对象(15.2.4)。的价值   Math对象的[[Class]]内部属性是" Math"。

     

Math对象没有[[Construct]]内部属性;它是   不可能将Math对象用作new的构造函数   操作

     

Math对象没有[[Call]]内部属性;无法将Math对象作为函数调用。

javascript中的每个对象都有一个构造函数,而Math是一个对象,因此它有一个构造函数,并不意味着你可以创建它的新实例,它与



var Math = {
  random : true,
  max    : false
}

new Math(); // epic fail, not a constructor (function)




答案 1 :(得分:1)

来自https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/constructor

  

所有对象都从其原型继承构造函数:

var o = {};
o.constructor === Object; // true

var a = [];
a.constructor === Array; // true

Math只是一个预定义的全局对象,因此:

Math.constructor === Object;

虽然很少使用,var obj = new Object()是有效的javascript。 var obj = {}更常见,更短;改为使用它。