2012-11-08 40 views
82
var err1 = Error('message'); 
var err2 = new Error('message'); 

Sự khác biệt là gì? Nhìn vào chúng trong bảng điều khiển chrome, chúng trông giống hệt nhau. Các thuộc tính giống nhau trên đối tượng và cùng một chuỗi __proto__. Hầu như có vẻ như Error hoạt động như một nhà máy.ném lỗi ('msg') và ném lỗi mới ('msg')

Điều nào là đúng và tại sao?

+5

Tất cả các nhà thầu có nguồn gốc được định nghĩa trong ECMAScript, trong đó có mình hành vi khi được gọi mà không có 'mới'. –

+2

Xem thêm [Khi nào là 'Lỗi mới()' tốt hơn 'Lỗi()'?] (Http://stackoverflow.com/q/38759428/1048572) – Bergi

Trả lời

82

Cả hai đều tốt; điều này được quy định rõ ràng trong the specification:

... Do đó, chức năng gọi Error(…) tương đương với biểu thức tạo đối tượng new Error(…) với những lập luận tương tự.

+0

Điều này có đúng trong ES6 không? – paulmelnikow

11

Error không hành động như một nhà máy, trên thực tế hầu hết các nhà xây dựng có nguồn gốc làm: Array, Object ... tất cả cái gì đó kiểm tra như if (!(this instanceof Array)){ return new Array(arguments);}

Điều đó nói rằng, trong trường hợp của một lỗi, nó thậm chí không cần thiết để ném một đối tượng Error ... throw 'Bad things happened'; sẽ làm việc, quá
Bạn thậm chí có thể ném một vật thể đen để gỡ lỗi:

throw {message:"You've been a naughty boy", 
     context: this, 
     args: arguments, 
     more:'More custom info here'}; 
+3

Tôi sợ tôi không hoàn toàn đồng ý. 'String (" abc ")' không tạo đối tượng 'String', trong khi' new String ("abc") 'thì không. – pimvdb

+1

@pimvdb: true, tôi đã thay đổi nó thành 'Object' =>' Object ('foo') 'trả về một đối tượng chuỗi ... đến với điều của nó. Hầu hết tất cả các hàm tạo native đều sai một chút ...' Số ',' Boolean', 'Date',' String' đều không ... 'Array',' Object' và 'Error' làm, nhưng' Event' và tất cả các hàm tạo 'DOMxxxx'-api ném lỗi –

+0

Tôi cũng nghĩ rằng 'new Array (arguments)' không thực hiện chính xác những gì 'Array (1, 2, 3)' làm. Nhưng có lẽ tôi chỉ cần nitpicking :) – pimvdb

Các vấn đề liên quan