请考虑以下事项:
x = function () {}
p = new x()
console.log(p) // ok
Math.z = function () {}
p = new Math.z()
console.log(p) // ok
p = new Math.round()
console.log(p) // TypeError: function round() { [native code] } is not a constructor
所以我可以将new
与我自己的函数一起使用,但不能与Math.round
一起使用。是什么让它如此特别?这是在某处记录的吗?
答案 0 :(得分:8)
Math.round
没什么特别的。你可以在自己的函数上复制这个行为:
MyClass = function(){};
MyClass.round = function(x){
if(this instanceof MyClass.round)
throw 'TypeError: MyClass.round is not a constructor';
return Math.round(x);
}
console.log(MyClass.round(0.5)); // 1
new MyClass.round(); // 'TypeError: MyClass.round is not a constructor'
事实上,您可以使用类似的模式在您的班级中将new
关键字设为可选:
function MyClass(){
if(!(this instanceof MyClass)) // If not using new
return new MyClass(); // Create a new instance and return it
// Do normal constructor stuff
this.x = 5;
}
(new MyClass()).x === MyClass().x;
至于为什么new
不能与内置函数和方法一起使用,这是设计和记录的:
除非在特定函数的描述中另有规定,否则本节中描述的非构造函数的内置函数都不应实现[[Construct]]内部方法。 - http://es5.github.com/#x15
答案 1 :(得分:2)
这是一种方法,这就是为什么你不能把new
放在它之前。
PS:
new alert() //TypeError: Illegal invocation
new console.log() //TypeError: Illegal invocation
new function(){} //OK
答案 2 :(得分:1)
Math是一个类,因此您可以从中创建一个对象。 Math.round是一种数学方法。您无法从方法创建对象。