2017-08-08 15 views
5

"Thuộc tính new.target cho phép bạn phát hiện xem một hàm hoặc constructor được gọi là sử dụng toán tử mới" [1]new.target với một nhà điều hành tiền tố

tôi có thể sử dụng new.target trong một câu lệnh if để ném ra một lỗi nếu một chức năng không được gọi bằng new:

if(!new.target){ 
    throw new Error('Must be called with new keyword!') 
} 

Tuy nhiên, safari ngăn new.target từ được sử dụng với các ! theo cách này, với thông báo lỗi

new.target không thể đến sau toán tử tiền tố

Tôi đã theo dõi số này xuống this line in Webkit.

Tuy nhiên, điều kiện tích cực có thể được kiểm tra!

if(new.target){} 
else{ 
    throw new Error('Must be called with new keyword!') 
} 

Đây có phải là lỗi với công cụ phân tích cú pháp của safari không? Hoặc cách khác, nên Tôi đang sử dụng new.target theo cách họ thực thi?

repro đơn giản: https://codepen.io/mdjasper/pen/eEWORY?editors=0012


Edit: Vấn đề này đã được nộp trên webkit bugzilla: https://bugs.webkit.org/show_bug.cgi?id=157970

+0

Ra khỏi tò mò, những gì sẽ xảy ra nếu bạn nói '! (New.target)'? – mhodges

+0

Câu hỏi hay, không nghĩ về điều đó. Chỉ cần thử nó ra, và vẫn còn lỗi ra mặc dù:/ –

+0

Con người, đó là rất lạ. [Bảng tương thích trình duyệt] (https://kangax.github.io/compat-table/es6/) cho thấy nó có hỗ trợ đầy đủ trong Safari, nhưng [MDN] (https://developer.mozilla.org/en-US/ docs/Web/JavaScript/Reference/Operators/new.target) không hỗ trợ ... – mhodges

Trả lời

0

Cú pháp này cần được hỗ trợ, và các lỗi đã được xác nhận là một lỗi webkit:

if(!new.target){ 
    throw new Error('Must be called with new keyword!') 
} 

Bản vá đã được viết và hợp nhất và sẽ xuất xưởng với phiên bản webkit tương lai

https://bugs.webkit.org/show_bug.cgi?id=157970#c17

Cho đến các vùng đất sửa chữa trong một phiên bản phát hành, một cách giải quyết là để kiểm tra một cách rõ ràng new.target

if(new.target === undefined){ 
    throw new Error('Must be called with new keyword!') 
}