这是一个我无法弄清楚的技巧问题。当我从MDN读取时,我们无法从Math
创建实例。运行new Math()
将产生异常Math is not a constructor
。但是Math在Math.constructor
内有自己的属性。是的Object
类型,但我们可以运行它Math.constructor()
。但即使我们通过exec Math.constructor = Function.constructor
重新定义它,它也会抛出异常。
现在我脑子里有一些假设:
有人可以彻底回答我为什么构造函数存在但我无法创建实例吗?
提前致谢。
答案 0 :(得分:2)
引用自己的答案是
因为规范是这样说的
数学对象
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 = {}
更常见,更短;改为使用它。