SyntaxError: reference to undeclared private field or method #x

Ngoại lệ JavaScript "reference to undeclared private field or method #x" xảy ra khi một tên private được sử dụng, nhưng tên private này không được khai báo trong phạm vi class.

Thông báo

SyntaxError: Private field '#x' must be declared in an enclosing class (V8-based)
SyntaxError: reference to undeclared private field or method #x (Firefox)
SyntaxError: Cannot reference undeclared private names: "#x" (Safari)

Loại lỗi

SyntaxError

Điều gì đã xảy ra?

Không giống như các thuộc tính string hoặc symbol thông thường, trả về undefined nếu thuộc tính không tồn tại, tên private rất nghiêm ngặt và chỉ có thể được truy cập hợp lệ nếu chúng thực sự tồn tại. Việc truy cập một tên private chưa được khai báo sẽ dẫn đến lỗi cú pháp, trong khi việc truy cập một tên private đã được khai báo nhưng không tồn tại trên đối tượng sẽ dẫn đến lỗi type.

Ví dụ

Trường private chưa được khai báo

Bạn không thể truy cập một trường private không được khai báo trong phạm vi class.

js
class MyClass {
  doSomething() {
    console.log(this.#x);
  }
}

Lỗi tương tự xảy ra nếu bạn sử dụng toán tử in để kiểm tra một trường private chưa được khai báo.

js
class MyClass {
  doSomething() {
    console.log(#x in this);
  }
}

Những đoạn code này có thể là lỗi vì không thể có #x tồn tại trên this nếu nó không được khai báo trong phạm vi class. Lưu ý rằng bạn không thể tự động thêm các phần tử private vào các đối tượng không liên quan. Bạn nên xóa code này hoặc khai báo trường private trong phạm vi class.

js
class MyClass {
  #x = 0;
  doSomething() {
    console.log(this.#x);
  }
}

Xem thêm