Đối tượng

Đối tượng là một loại dữ liệu riêng biệt theo cách mà mỗi dữ liệu nguyên gốc là một loại dữ liệu, có một điểm khác biệt quan trọng: không giống như dữ liệu nguyên gốc, các đối tượng có thể biến đổi. Một đối tượng có thể chứa dữ liệu liên kết với giá trị nhận dạng, chẳng hạn như một biến, nhưng vẫn giữ loại dữ liệu object bất kể đối tượng đó chứa dữ liệu nào.

Ngoài dữ liệu nguyên gốc, tất cả giá trị JavaScript đều là đối tượng, mặc dù ngay cả khi giá trị nguyên gốc biểu thị hành vi giống đối tượng do tính kế thừa nguyên mẫu, nên JavaScript được tạo thành từ các đối tượng một cách hiệu quả.

Hằng đối tượng là một cặp dấu ngoặc nhọn bao quanh số 0 hoặc nhiều cặp khoá-giá trị được gọi là "thuộc tính", có thể chứa bất kỳ giá trị JavaScript nào.

{
    "myProperty" : true
}

Khoá thuộc tính có thể là bất kỳ biểu tượng hoặc chuỗi nào. Khi chỉ định giá trị nhận dạng cho một biến, các chuỗi dùng làm khoá thuộc tính phải dễ dự đoán và mang tính mô tả:

let carAttributes = {
    "color" : "red"
};

carAttributes
> Object { color: "red" }

Khoá thuộc tính yêu cầu giá trị cố định dạng chuỗi (') hoặc dấu ngoặc kép (") chứ không phải giá trị cố định mẫu:

let carAttributes = {
    `keyString` : false
};
> Uncaught SyntaxError: expected property name, got template literal

Giá trị thuộc tính có thể ở bất kỳ loại dữ liệu nào. Các thuộc tính của một đối tượng có thể tự chứa các đối tượng với những thuộc tính riêng:

let myObject = {
    'key' : {
        'subkey' : true,
        'othersubkey' : false
    }
};

myObject;
> Object { key: Object { subkey: true, othersubkey: false } }

Khi giá trị của một thuộc tính là một hàm, thuộc tính đó được gọi là "phương thức".

const myObject = {
    "myProperty" : true,
    myMethod() {
        console.log( "This is a method." );
    }
}

myObject.myProperty;
> true

myObject.myMethod();
> "This is a method."

Bạn cũng có thể tạo một đối tượng bằng từ khoá new:

let myObject = new Object();

Trong các ví dụ trước, các giá trị cố định đối tượng mới tạo đã được gán cho các biến. Điều này là không bắt buộc, vì giống như mọi loại dữ liệu khác, bạn có thể sử dụng một đối tượng mà không cần giá trị nhận dạng ở bất kỳ nơi nào một đối tượng được mong đợi. Tuy nhiên, giá trị cố định đối tượng yêu cầu dấu ngoặc đơn trong mọi ngữ cảnh có thể bị nhầm lẫn đối với một câu lệnh khối, vì 2 cú pháp dấu ngoặc nhọn có chung ({}). Việc khởi chạy một biến không bao giờ yêu cầu điều này.

{ "value" : 2 }
> Uncaught SyntaxError: unexpected token: ':'

({ "value" : 2 })
> Object { value: 2 }

let valObj = { "value" : 2 };

valObj;
> Object { value: 2 }

Không giống như dữ liệu gốc, không có sự khác biệt có ý nghĩa nào trong kết quả tạo đối tượng bằng new Object() và tạo giá trị cố định đối tượng, vì kết quả trong cả hai trường hợp đều sẽ là một đối tượng có các thuộc tính kế thừa từ nguyên mẫu Object. Tuy nhiên, có một điểm khác biệt thực tế giữa hai cú pháp này.

Từ khoá new phải xác định một đối tượng trống sẽ được điền dữ liệu sau này:

let myObject = new Object();

myObject.booleanValue = true;
myObject.stringValue = "My string.";

Một giá trị cố định đối tượng có thể được điền sẵn bằng dữ liệu khi được tạo:

let myObject = {
    'booleanValue' : true,
    'stringValue' : "My string."
};

Mặc dù ít được sử dụng trong thực tế, nhưng bạn có thể sử dụng new Object() để biến các giá trị dữ liệu gốc thành Đối tượng thuộc loại tương ứng, chẳng hạn như các giá trị được trả về bằng cách sử dụng từ khoá new cùng với hàm hàm khởi tạo. Ví dụ: hàm sau đây tương đương với new Number( 10 ):

let myObject = new Object( 10 );

myObject;
> Number { 10 }

Các giá trị nullundefined dẫn đến một đối tượng trống, có chức năng giống hệt với việc gọi new Object() mà không cung cấp một đối số.

Chuyển một đối tượng cố định vào new Object() dưới dạng một đối số sẽ truyền đối tượng cố định mà không thay đổi đối tượng đó:

let myObject = new Object( { myValue : 10 } );

myObject;
> Object { myValue: 10 }

Tương tự như việc sử dụng hàm khởi tạo cho các giá trị gốc, việc sử dụng hàm khởi tạo cho các đối tượng hiếm khi có lợi ích so với việc sử dụng ký hiệu giá trị cố định đối tượng. Ngay cả khi tạo các đối tượng trống để điền giá trị sau này, nhà phát triển vẫn có xu hướng ưu tiên ký hiệu chữ của đối tượng để đơn giản.

Kiểm tra kiến thức

Bạn có thể sử dụng loại ký hiệu nào để đặt thuộc tính của một đối tượng?

Ký hiệu dấu chấm
Ký hiệu dấu ngoặc
Ký hiệu dấu chấm
Ký hiệu đường kẻ

Câu nào sau đây là cú pháp đúng để nhận giá trị của myProp

myObj["myProp"];
myObj{"myProp"};
myObj("myProp");