Các trường và phương thức của lớp

Các trường của lớp được khai báo trực tiếp trong phần nội dung của lớp, không được khai báo một cách rõ ràng được thêm dưới dạng thuộc tính của giá trị this. Tuy nhiên, kết quả vẫn như nhau: một được xác định trên các bản sao của lớp đó.

class MyClass {
    myField;
}

const myClassInstance = new MyClass();

myClassInstance;
> MyClass { myField: undefined }

Bạn có thể khởi tạo một trường có một giá trị. Đây thường là giá trị mặc định mà logic trong lớp có thể ghi đè:

class MyClass {
    myResult = false;
    set setValue( myValue ) {
        this.myResult = myValue;
    }
}
const myClassInstance = new MyClass();

myClassInstance;
> Object { myResult: false }

myClassInstance.setValue = true;

myClassInstance;\
> Object { myResult: true }

Các trường của lớp có chức năng giống với những thuộc tính đi kèm với lớp đang sử dụng this. Điều này có nghĩa là bạn có thể truy cập và sửa đổi các tệp này từ bên ngoài giống như mọi thuộc tính khác.

class MyClass {
    myField = true;
}

const myClassInstance = new MyClass();

myClassInstance.myField;
> true

myClassInstance.myField = false;

myClassInstance.myField;
> false;

Các trường là cơ sở cho một số tính năng nâng cao hơn của lớp.

Trường và phương thức riêng tư

Không thể truy cập vào các trường và phương thức riêng tư bên ngoài một lớp. Một thuộc tính được liên kết với một thực thể của lớp, tức là mỗi thực thể chứa tập hợp các trường và phương thức riêng tư riêng, như được xác định trên lớp.

Để đặt một cơ sở lưu trú ở chế độ riêng tư, hãy thêm # vào đầu giá trị nhận dạng khi bạn khai báo việc đó:

class MyClass {
    #myPrivateField = true;
    #myPrivateMethod() {}
}
const myClassInstance = new MyClass();

myClassInstance;
> MyClass { #myPrivateField: true }
    #myPrivateField: true
    <prototype>: Object {  }
        constructor: class MyClass {}
        <prototype>: Object {  }

Bạn phải khai báo một trường riêng tư trong phần nội dung của lớp chứa lớp đó. Bạn có thể sau này thay đổi giá trị của biến này dưới dạng thuộc tính của this, nhưng bạn không thể tạo trường này đang sử dụng this.

Bạn không thể truy cập vào các trường riêng tư từ nơi khác trong một tập lệnh. Thao tác này ngăn chặn dữ liệu các thuộc tính không bị thay đổi bên ngoài phương thức getter và setter được cung cấp tương tác với các giá trị trong đó đồng thời ngăn chặn quyền truy cập trực tiếp vào chỉ nhằm mục đích sử dụng trong lớp.

class MyClass {
    #myResult = false;
    set setValue( myValue ) {
        this.#myResult = myValue;
    }
}
const myClassInstance = new MyClass();

myClassInstance;
> MyClass { #myResult: false }

myClassInstance.#myResult = true;
> Uncaught SyntaxError: reference to undeclared private field or method #myResult

myClassInstance.setValue = true;

myClassInstance;\
> MyClass { #myResult: true }

Tuy nhiên, hãy lưu ý rằng bảng điều khiển dành cho nhà phát triển thường rất thoải mái, mặc dù không nhất quán, về việc cho phép truy cập vào các trường riêng tư để gỡ lỗi mục đích:

class MyClass {
    #myPrivateField = true;
    #myPrivateMethod() {
        console.log( "This is inside a private method." );
    }
}
const myClassInstance = new MyClass();

myClassInstance;
> MyClass {#myPrivateField: true}

myClassInstance.#myPrivateField;
> true

myClassInstance.#myPrivateMethod();
> "This is inside a private method."
class MyClass {
    #myPrivateField = true;
    #myPrivateMethod() {
        console.log( "This is inside a private method." );
    }
}
const myClassInstance = new MyClass();

myClassInstance;
> MyClass {#myPrivateField: true}

myClassInstance.#myPrivateField;
> Uncaught SyntaxError: reference to undeclared private field or method #myPrivateField

myClassInstance.#myPrivateMethod();
> Uncaught SyntaxError: reference to undeclared private field or method #myPrivateMethod

Các trường riêng tư nằm trong phạm vi chặt chẽ với phần nội dung của lớp chứa các trường đó, có nghĩa là ngay cả lớp con cũng không thể truy cập vào các trường riêng tư liên kết với lớp mẹ:

class MyClass {
    #myPrivateField = true;
}
class ChildClass extends MyClass {
    childMethod() {
        console.log( this.#myPrivateField );
    }
}
> Uncaught SyntaxError: reference to undeclared private field or method #myPrivateField

Trường và phương thức tĩnh

Các trường và phương thức tĩnh là thành phần của một lớp, không phải là thành phần của thực thể của lớp đó. Do đó, trường tĩnh sẽ cung cấp điểm cho dữ liệu sẽ không là duy nhất cho từng thực thể của một lớp, nhưng những dữ liệu đó các phiên bản có thể cần tham chiếu, ví dụ: thông tin cấu hình được chia sẻ. Phương thức tĩnh thường là các hàm hiệu dụng để làm việc với các thực thể của một lớp, chẳng hạn như so sánh hoặc sắp xếp các thực thể với một trường có trong đó.

Để xác định các trường và phương thức tĩnh trong phần nội dung của một lớp, hãy sử dụng static từ khóa:

class MyClass {
    static myStaticField;
    static myStaticMethod() {}
}
const myClassInstance = new MyClass();

Bạn cũng có thể sử dụng ký hiệu dấu chấm để tạo một phương thức tĩnh:

class MyClass {
    constructor() {}
}
MyClass.myStaticMethod = function() {}

Bạn không thể truy cập vào các thuộc tính tĩnh qua một thực thể của lớp, nhưng chúng có trong hàm khởi tạo lớp:

class MyClass {
    static myStaticField = true;
    static myStaticMethod() {
        console.log( "A static method." );
    }
}
const myClassInstance = new MyClass();

myClassInstance.myStaticField;
> undefined

myClassInstance.myStaticMethod();
> Uncaught TypeError: myClassInstance.myStaticMethod is not a function

MyClass.myStaticField;
> true

MyClass.myStaticMethod();
> "A static method."

Về mặt kỹ thuật, chúng không bắt buộc, nhưng tốt nhất là sử dụng phương thức tĩnh tạo các tiện ích để làm việc với các thực thể của một lớp. Các ví dụ về điều này có thể bao gồm một phương thức tĩnh dành riêng để sắp xếp các thực thể của một lớp, hoặc chứa mọi thông tin thiết lập cần thiết để tạo một phiên bản lớp rồi trả về thực thể lớp:

class User {
    constructor( name, email ) {
        this.name = name;
        this.email = email;
    }
    static fromObject( myObject ) {
        return new User( myObject.name, myObject.email ?? "Omitted" );
    }
}
const userObject = {
    "name" : "My Name",
    "email" : "my@email.address"
};
const secondUserObject = {
    "name" : "My Name"
};

const firstUser = User.fromObject( userObject );
const secondUser = User.fromObject( secondUserObject );

firstUser;
> Object { name: "My Name", email: "my@email.address" }

secondUser;
> Object { name: "My Name", email: "Omitted" }

Kiểm tra kiến thức

Chỉ có thể truy cập loại trường nào sau đây từ bên trong lớp học này?

Static fields
Trường riêng tư
Trường về lớp