var err1 = Error('message');
var err2 = new Error('message');
有什么不同?在chrome控制台中查看它们,它们看起来相同。对象和__proto__
链上的属性相同。几乎Error
就像是工厂一样。
哪一个是正确的,为什么?
var err1 = Error('message');
var err2 = new Error('message');
有什么不同?在chrome控制台中查看它们,它们看起来相同。对象和__proto__
链上的属性相同。几乎Error
就像是工厂一样。
哪一个是正确的,为什么?
Answers:
两者都很好;这在规范中有明确说明:
...因此,函数调用
Error(…)
等效于new Error(…)
具有相同参数的对象创建表达式。
Error
确实像一个工厂,像其他一些本土的构造函数:Array
,Object
,等所有的检查类似if (!(this instanceof Array)) { return new Array(arguments); }
。(但请注意,String(x)
和new String(x)
是非常不同的,对于Number
和也是如此Boolean
。)
就是说,如果发生错误,甚至不需要抛出Error
对象…… throw 'Bad things happened';
也可以工作。
您甚至可以抛出对象文字以进行调试:
throw {message:"You've been a naughty boy",
context: this,
args: arguments,
more:'More custom info here'};
String("abc")
不会创建String
对象,而new String("abc")
会创建对象。
Object
=> Object('foo')
返回一个String对象...来的事它几乎所有的原生构造是有点不对劲...... Number
,Boolean
,Date
,String
所有不... Array
,Object
和Error
做,但是Event
所有DOMxxxx
-api构造函数都会引发错误
new Array(arguments)
并不能完全Array(1, 2, 3)
做到。但可能我只是在挑剔:)
Error
实例(或字符串文字)会松开堆栈跟踪。对链接的文章只是一个吹毛求疵:arguments.callee
禁止在严格的模式
new
。