Trong Javascript tất cả các tờ khai (var, hãy, const, chức năng, chức năng *, lớp) đều được kéo lên nhưng nó cần được khai báo trong cùng phạm vi.
Như bạn nói "lớp ES6 chỉ là một đường cú pháp trên JavaScript của thừa kế dựa trên nguyên mẫu hiện"
Vì vậy, Chúng ta hãy hiểu nó là gì?
Ở đây bạn đã khai báo một lớp thực tế là "hàm đặc biệt". Giả sử rằng hàm Foo() và lớp Foo của bạn đều nằm trong phạm vi toàn cục.
class Foo {
constructor(x, y) {
this.x = x;
this.y = y;
}
}
Sau đây là mã được biên dịch của lớp học của bạn Foo.
var Foo = (function() {
function Foo(x, y) {
this.x = x;
this.y = y;
}
return Foo;
}());
Nội bộ lớp học của bạn được chuyển thành chức năng có cùng tên bên trong hàm wrapper (iife) và hàm bao hàm đó trả về hàm của bạn.
Vì phạm vi (lớp) của hàm được thay đổi. và bạn đang cố gắng tạo ra đối tượng của hàm trong phạm vi toàn cục mà trong thực tế không tồn tại.
bạn nhận được hàm trong biến Foo khi biên dịch xuất hiện. vì vậy sau này bạn có chức năng trong var bạn có thể tạo đối tượng đó.
Nguồn
2017-09-17 13:41:23
Các lớp ES6 * không * chỉ là cú pháp, mặc dù chúng hầu hết là * đường cú pháp. –
Tời kéo là một nguồn hiểu lầm và nhầm lẫn gần như vô tận. Tất cả các cấu trúc khai báo mới ('let',' const', 'class') được thêm vào trong ES6 đều không được lưu trữ (tốt, chúng là * half-hoisted *). Chặn một trích dẫn từ Eich hoặc tương tự, bạn sẽ không nhận được câu trả lời mà không phải là suy đoán hiệu quả. –
@mmm: MDN được cộng đồng chỉnh sửa và đôi khi sai. Không thường xuyên, không phải là thường xuyên như, nói rằng, trang web khác, nhưng đôi khi. Xem [câu trả lời này] (http://stackoverflow.com/a/31222689/157247) để biết cách chúng được treo và không treo. –