Đối tượng là một kiểu dữ liệu rời rạc theo cách tương tự như
gốc là một loại dữ liệu trong đó có một thuộc tính quan trọng
khác biệt: không giống như dữ liệu nguyên gố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, như một biến, nhưng vẫn giữ lại dữ liệu object
bất kể dữ liệu trong đó.
Ngoài giá trị gốc, tất cả giá trị JavaScript đều là đối tượng, mặc dù vì ngay cả khi các giá trị cố định gốc biểu thị hành vi giống đối tượng do tính kế thừa nguyên mẫu thường cho biết JavaScript được tạo thành từ các đối tượng.
Hằng đối tượng là một cặp dấu ngoặc nhọn bao quanh số 0 hoặc nhiều khoá-giá trị được gọi là "thuộc tính" tệp này 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ỳ ký hiệu hoặc chuỗi. Như khi gán giá trị nhận dạng cho một biến, các chuỗi được dùng làm khoá thuộc tính phải dễ dự đoán và mô tả:
let carAttributes = {
"color" : "red"
};
carAttributes
> Object { color: "red" }
Khoá thuộc tính yêu cầu một 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 của mẫu:
let carAttributes = {
`keyString` : false
};
> Uncaught SyntaxError: expected property name, got template literal
Giá trị của thuộc tính có thể là 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 có 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 của đối tượng mới tạo đã được chỉ định
với các biến. Bạn không bắt buộc phải làm vậy vì giống như mọi loại dữ liệu khác, bạn có thể sử dụng
đối tượng không có giá trị nhận dạng ở bất kỳ nơi nào đối tượng được dự kiến. Tuy nhiên, một
đối tượng sẽ yêu cầu dấu ngoặc đơn trong bất kỳ ngữ cảnh nào có thể gây nhầm lẫn
cho câu lệnh khối, vì hai câu lệnh này dùng chung cú pháp dấu ngoặc nhọn ({}
).
Việc khởi chạy một biến không bao giờ yêu cầu thực hiện việc 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 đáng kể nào trong kết quả tạo
một đối tượng sử dụng new Object()
và tạo một đối tượng cố định, vì giá trị
thì cả hai trường hợp đều sẽ là một đối tượng có các thuộc tính được kế thừa từ
Nguyên mẫu Object
. Tuy nhiên, có một điểm khác biệt trên thực tế giữa hai
các cú pháp khác.
Từ khoá new
phải xác định một đối tượng trống sẽ được điền dữ liệu sau đó:
let myObject = new Object();
myObject.booleanValue = true;
myObject.stringValue = "My string.";
Một đối tượng có thể được điền sẵn dữ liệu khi đối tượng đượ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ể dùng new Object()
để biến những thành phần cơ bản
vào các đối tượng thuộc loại tương ứng, chẳng hạn như các đối tượng được trả về bằng cách sử dụng
từ khoá new
cùng với 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ị null
và undefined
dẫn đến một đối tượng trống, có chức năng giống hệt nhau
để gọi new Object()
mà không cung cấp đối số.
Truyền một giá trị cố định đối tượng đến new Object()
dưới dạng một đối số truyền đối tượng
mà không thay đổi:
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, hãy sử dụng hàm khởi tạo cho đối tượng hiếm khi có bất kỳ lợi ích nào so với việc sử dụng ký hiệu bằng chữ đối tượng. Ngay cả khi tạo các đối tượng trống sẽ được điền giá trị sau này, nhà phát triển có xu hướng ưu tiên đối tượng ký hiệu cố định nhằm mục đích đơn giản.
Kiểm tra kiến thức
Bạn có thể sử dụng các kiểu ký hiệu nào để đặt thuộc tính của một đối tượng?
Câu nào sau đây là cú pháp chính xác để nhận giá trị
/ myProp
myObj["myProp"];
myObj("myProp");
myObj{"myProp"};