JavaScript: Đối tượng – Object

JavaScript hỗ trợ mở rộng các loại dữ liệu. Đối tượng JavaScript là một cách tuyệt vời để định nghĩa các loại dữ liệu tùy chỉnh.

Một đối tượng là một thể hiện chứa một tập hợp các cặp giá trị khóa. Không giống như các kiểu dữ liệu nguyên thủy, các đối tượng có thể biểu thị nhiều giá trị hoặc phức tạp và có thể thay đổi theo thời gian sống của chúng. Các giá trị có thể là giá trị vô hướng, hàm, thậm chí là mảng các đối tượng khác.

Bộ khởi tạo đối tượng

Giống như các kiểu nguyên thủy, các đối tượng có cú pháp theo đúng nghĩa đen: cặp ngoặc xoắn ({và}). Sau đây là cú pháp định nghĩa một đối tượng.

var obj = {
   Key1:value,
   Key2: function() {
      //khối_lệnh
   },
   Key3: [“content1”,” content2”]
}

Nội dung của một đối tượng được gọi là thuộc tính (hoặc thành phần) và thuộc tính bao gồm tên (hoặc khóa) và giá trị. Tên thuộc tính phải là chuỗi hoặc ký hiệu và các giá trị có thể là bất kỳ loại nào (bao gồm cả các đối tượng khác).

Giống như tất cả các biến JavaScript, cả tên đối tượng (có thể là biến thông thường) và tên thuộc tính đều phân biệt chữ hoa chữ thường. Ta truy cập các thuộc tính của một đối tượng bằng cách sử dụng toán tử dấu chấm

Cú pháp:

objectName.propertyName

Ví dụ:

var

human

=

{

firstname

:

"Long"

,

lastname

:

"Dang"

,

func

:

function

(){

return

"Hi V1Study!!"

},

};

//truy cập các member của đối tượng

console

.

log

(

human

.

firstname

)

console

.

log

(

human

.

lastname

)

console

.

log

(

human

.

func

())

Output:

Long 
Dang
Hi V1Study!!

Trong ES6 ta có thể đưa 1 biến nào đó làm thuộc tính của đối tượng.

Thí dụ

var

a

=

'abc'

var

obj

=

{

a

}

console

.

log

(

obj

.

a

)

Đoạn code trên định nghĩa một đối tượng có tên obj và có 1 thuộc tính là a, với a là biến được khai báo trước đó.

Hàm tạo Object()

JavaScript cung cấp một hàm tạo đặc biệt gọi là Object() để tạo thể hiện của đối tượng. Object() sẽ kết hợp với toán tử new để tạo một thể hiện của đối tượng.

Cú pháp:

var obj = new Object(); 
obj.prop = value;    
Hoặc:
obj["prop"] = value 

Sau đây là cú pháp để truy cập vào một thuộc tính:

objectName.tên_thuộc_tính
Hoặc:
objectName["tên_thuộc_tính"]

Ví dụ

//Định nghĩa đối tượng

var

mySubject

=

new

Object

();

mySubject

.

name

=

"PHP"

;

mySubject

.

numberSession

=

30

;

mySubject

.

money

=

3000000

;

//Truy cập thành phần của đối tượng

console

.

log

(

mySubject

[

"name"

])

console

.

log

(

mySubject

[

"numberSession"

])

console

.

log

(

mySubject

[

"money"

])

Ouptput:

PHP 
30
3000000

Các thuộc tính mà chưa được gán của một đối tượng sẽ được coi là không tồn tại.

Ví dụ

var

myCar

=

new

Object

();

myCar

.

make

=

"Ford"

;

console

.

log

(

myCar

[

"model"

])

Kết quả:

undefined

Lưu ý: Tên thuộc tính đối tượng có thể là bất kỳ chuỗi JavaScript hợp lệ hoặc bất kỳ dữ liệu gì có thể được chuyển đổi thành chuỗi, bao gồm cả chuỗi rỗng. Tuy nhiên, bất kỳ tên thuộc tính nào không phải là định danh JavaScript hợp lệ (ví dụ: tên thuộc tính có dấu cách hoặc dấu gạch nối hoặc bắt đầu bằng số) thì chỉ có thể được truy cập bằng cách sử dụng ký hiệu dấu ngoặc vuông.

Các thuộc tính cũng có thể được truy cập bằng cách sử dụng một giá trị chuỗi được lưu trữ trong một biến. Nói cách khác, khóa thuộc tính của đối tượng có thể là một giá trị động, ví dụ như một biến chẳng hạn. Khái niệm nói trên được minh họa trong ví dụ sau.

Ví dụ

var

myCar

=

new

Object

()

var

propertyName

=

"make"

;

myCar

[

propertyName

]

=

"Ford"

;

console

.

log

(

myCar

.

make

)

Output:

Ford

Hàm tạo

Một đối tượng có thể được tạo bằng hai bước sau:

Bước 1: Định nghĩa loại đối tượng bằng cách viết hàm tạo function.

Cú pháp:

function tên_hàm() {
   this.property_name = giá_trị
}

Từ khóa ‘this’ dùng để chỉ đối tượng hiện tại đang sử dụng và định nghĩa thuộc tính của đối tượng.

Bước 2: Tạo một thể hiện của đối tượng dùng từ khóa new.

var tên_đối_tượng= new tên_hàm()

//Truy cập thuộc tính
tên_đối_tượng.property_name

Từ khóa new gọi hàm tạo function và khởi tạo các khóa thuộc tính của hàm.

Ví dụ sử dụng hàm tạo function

function

Car

()

{

this

.

make

=

"Ford"

this

.

model

=

"F123"

}

var

obj

=

new

Car

()

console

.

log

(

obj

.

make

)

console

.

log

(

obj

.

model

)

Output:

Ford
F123

Ta hoàn toàn có thể thêm thuộc tính mới cho đối tượng đã được tạo từ trước. Ví dụ:

function

Car

()

{

this

.

make

=

"Ford"

}

var

obj

=

new

Car

()

obj

.

model

=

"F123"

console

.

log

(

obj

.

make

)

console

.

log

(

obj

.

model

)

Output:

Ford 
F123

Phương thức Object.create

Các đối tượng cũng có thể được tạo bằng phương thức Object.create(). Phương thức này cho phép ta tạo nguyên mẫu cho đối tượng mong muốn mà không phải định nghĩa hàm tạo function.

Ví dụ

var

roles

=

{

type

:

"Admin"

,

// Giá trị mặc định của thuộc tính

displayType

:

function

()

{

//Hiển thị type

console

.

log

(

this

.

type

);

}

}

//Tạo thể hiện của roles có tên super_role

var

super_role

=

Object

.

create

(

roles

);

super_role

.

displayType

();

// Output: Admin

//Tạo thể hiện của roles có tên guest_role

var

guest_role

=

Object

.

create

(

roles

);

guest_role

.

type

=

"Guest"

;

guest_role

.

displayType

();

// Output: Guest

Output:

Admin 
Guest

Hàm Object.assign()

Object.assign() được sử dụng để sao chép các giá trị của tất cả các thuộc tính riêng có thể đếm được từ một hoặc nhiều đối tượng nguồn vào một đối tượng đích. Nó sẽ trả về đối tượng đích.

Cú pháp:

Object.assign(đích, ...nguồn)    

Ví dụ nhân bản một đối tượng:

"use strict"

var

obj

=

{

name

:

"Tom"

,

ID

:

"E1001"

};

var

obj1

=

Object

.

assign

({},

obj

);

console

.

log

(

obj1

);

for

(

let

val

in

obj1

)

{

console

.

log

(

obj1

[

val

])

}

Output:

Tom 
E1001

Ví dụ gộp đối tượng:

var o1 = { a: 10 }; 
var o2 = { b: 20 }; 
var o3 = { c: 30 }; 
var obj = Object.assign(o1, o2, o3); 
console.log(obj);  
console.log(o1);

Output:

{ a: 10, b: 20, c: 30 } 
{ a: 10, b: 20, c: 30 }

Lưu ý: Không giống như sao chép các đối tượng, khi các đối tượng được gộp thì đối tượng lớn hơn không lưu trữ bản sao mới của các thuộc tính. Thay vào đó, nó giữ tham chiếu đến các thuộc tính có trong các đối tượng ban đầu. Ví dụ sau đây giải thích khái niệm này.

var

o1

=

{

a

:

10

};

var

obj

=

Object

.

assign

(

o1

);

obj

.

a

++

console

.

log

(

"Giá trị của 'a' trong đối tượng gộp sau khi tăng:"

)

console

.

log

(

obj

.

a

);

console

.

log

(

"Giá trị của 'a' trong đối tượng gốc sau khi tăng:"

)

console

.

log

(

o1

.

a

);

Output:

Giá trị của 'a' trong đối tượng gộp sau khi tăng:
11  
Giá trị của 'a' trong đối tượng gốc sau khi tăng:
11 

Xóa thuộc tính

Ta có thể xóa một thuộc tính của đối tượng bằng cách sử dụng toán tử delete.

Ví dụ

//Tạo một đối tượng có tên obj gồm 2 thuộc tính a và b.

var

obj

=

new

Object

;

obj

.

a

=

5

;

obj

.

b

=

12

;

//Xóa thuộc tính a

delete

myobj

.

a

;

console

.

log

(

"a"

in

obj

)

Output:

false

So sánh các đối tượng

Trong JavaScript thì đối tượng được hiểu là một kiểu tham chiếu. Hai đối tượng riêng biệt không bao giờ bằng nhau, ngay cả khi chúng có cùng các thuộc tính. Lý do là bởi chúng trỏ đến các địa chỉ bộ nhớ khác nhau. Chỉ những đối tượng chia sẻ cùng một tham chiếu mới giống nhau.

Ví dụ 1: Tham chiếu đối tượng khác nhau

var

a

=

{

name

:

"V1"

};

var

b

=

{

name

:

"V1"

};

console

.

log

(

a

==

b

)

// return false

console

.

log

(a

===

b

)

// return false

Trong ví dụ trên, a và b là hai đối tượng riêng biệt đề cập đến hai địa chỉ bộ nhớ khác nhau, vậy nên chúng khác nhau, và kết quả là trả về false.

Ví dụ 2: Tham chiếu đối tượng đơn

var

val1

=

{

name

:

"Tom"

};

var

val2

=

val1 console

.

log

(

val1

==

val2

)

// return true

console

.

log

(

val1

===

val2

)

// return true

Trong ví dụ trên, nội dung trong val1 được gán cho val2, tức là tham chiếu của các thuộc tính trong val1 được chia sẻ với val2. Vì vậy, chúng giống nhau, và kết quả là trả về true.

Đối tượng destructuring

Thuật ngữ destructuring có nghĩa là phá vỡ cấu trúc của một thực thể. Destructuring trong JavaScript cho phép trích xuất dữ liệu từ mảng hoặc đối tượng thành các biến khác nhau.

Ví dụ

var

emp

=

{

name

:

'John'

,

Id

:

3

}

var

{

name

,

Id

}

=

emp console

.

log

(

name

)

console

.

log

(

Id

)

Output:

John 
3