Định nghĩa Object trong JavaScript

Javascript nâng cao | by Học Javascript

Trong JavaScript, Object là một trong những kiểu dữ liệu quan trọng và được sử dụng phổ biến nhất. Nó cho phép lưu trữ và quản lý dữ liệu dưới dạng cặp key-value, giúp tổ chức thông tin một cách linh hoạt và hiệu quả. Không chỉ dừng lại ở việc lưu trữ dữ liệu, Object còn hỗ trợ các phương thức và cơ chế kế thừa, giúp JavaScript trở thành một ngôn ngữ lập trình hướng đối tượng mạnh mẽ.

Việc hiểu rõ về Object là nền tảng quan trọng để làm việc với JavaScript, từ các thao tác cơ bản như tạo, truy cập, chỉnh sửa thuộc tính đến các kỹ thuật nâng cao như destructuring, prototype, kế thừa và bất biến. Trong bài viết này, mình sẽ tìm hiểu chi tiết về Object, các cách tạo, thao tác và ứng dụng của nó trong lập trình JavaScript.

Object trong JavaScript là gì?

Trong JavaScript, Object là một kiểu dữ liệu quan trọng, dùng để lưu trữ và quản lý thông tin theo dạng cặp key-value (thuộc tính và giá trị). Điều này giúp Object trở thành một công cụ mạnh mẽ trong việc tổ chức dữ liệu và xây dựng các ứng dụng phức tạp.

Object trong JavaScript là một tập hợp các thuộc tính (properties), mỗi thuộc tính bao gồm một key và một value.

  • Key: Là tên thuộc tính, có thể là một chuỗi (string) hoặc Symbol.

  • Value: Có thể là bất kỳ kiểu dữ liệu nào như string, number, boolean, array, function, hoặc thậm chí là một object khác.

Ví dụ một Object đơn giản:

const person = {
  name: "John",   // Key: "name", Value: "John" (string)
  age: 30,        // Key: "age", Value: 30 (number)
  isStudent: false // Key: "isStudent", Value: false (boolean)
};

Object có thể chứa thuộc tính và phương thức

Trong JavaScript, Object không chỉ lưu trữ dữ liệu mà còn có thể chứa các phương thức (methods). Một phương thức là một hàm được định nghĩa bên trong object, giúp object có thể thực hiện các hành động cụ thể.

Ví dụ về Object có phương thức:

const person = {
  name: "Alice",
  age: 25,
  greet: function () {
    return `Hello, my name is ${this.name}`;
  }
};

console.log(person.greet()); // Output: "Hello, my name is Alice"
  • greet() là một phương thức của object person, nó sử dụng từ khóa this để truy cập thuộc tính của chính object đó.

  • this.name giúp lấy giá trị của key "name" trong object person.

Object có thể chứa nhiều loại dữ liệu khác nhau

Một object có thể chứa các loại giá trị khác nhau, bao gồm cả array và object lồng nhau (nested objects).

Ví dụ:

const student = {
  name: "Bob",
  age: 22,
  subjects: ["Math", "Physics", "Chemistry"], // Array trong object
  address: { // Object lồng trong object
    city: "New York",
    zip: "10001"
  }
};

console.log(student.name); // "Bob"
console.log(student.subjects[1]); // "Physics"
console.log(student.address.city); // "New York"
  • subjects chứa một mảng các môn học.

  • address là một object nằm bên trong object student, giúp tổ chức dữ liệu gọn gàng hơn.

Cách tạo Object trong JavaScript

Trong JavaScript, có nhiều cách để tạo một Object. Mỗi phương pháp có ưu điểm riêng, phù hợp với từng tình huống cụ thể. Dưới đây là các cách phổ biến để tạo Object trong JavaScript.

Cách 1: Sử dụng Object Literal ({})

Object Literal là cách đơn giản và trực quan nhất để tạo một Object. Đây là cách phổ biến được sử dụng khi cần tạo một Object đơn giản, không cần kế thừa từ các prototype khác.

Ví dụ:

const person = {
  name: "John",   // Thuộc tính (property)
  age: 30,        // Thuộc tính
  greet: function () {  // Phương thức (method)
    return "Hello!";
  }
};

console.log(person.name);  // "John"
console.log(person.age);   // 30
console.log(person.greet());  // "Hello!"

Cách 2: Sử dụng new Object()

Cách này sử dụng constructor mặc định của JavaScript để tạo Object. Sau khi khởi tạo Object bằng new Object(), ta có thể thêm các thuộc tính và phương thức vào nó.

Ví dụ:

const person = new Object();  // Tạo một Object trống
person.name = "John";         // Thêm thuộc tính
person.age = 30;
person.greet = function () {  // Thêm phương thức
  return "Hello!";
};

console.log(person.name);  // "John"
console.log(person.greet());  // "Hello!"

Cách 3: Sử dụng Hàm Tạo (Constructor Function)

Constructor Function là một cách tạo Object linh hoạt hơn, đặc biệt khi cần tạo nhiều Object có cùng cấu trúc. Hàm tạo sử dụng từ khóa this để gán giá trị cho thuộc tính và được gọi bằng từ khóa new.

Ví dụ:

function Person(name, age) {
  this.name = name;
  this.age = age;
  this.greet = function () {
    return `Hello, my name is ${this.name}`;
  };
}

const john = new Person("John", 30);
const alice = new Person("Alice", 25);

console.log(john.name);  // "John"
console.log(alice.greet());  // "Hello, my name is Alice"

Cách 4: Sử dụng class (ES6+)

Từ ES6, JavaScript hỗ trợ cú pháp class, giúp tạo Object theo mô hình hướng đối tượng dễ đọc hơn so với Constructor Function.

Ví dụ:

class Person {
  constructor(name, age) {
    this.name = name;
    this.age = age;
  }

  greet() {
    return `Hello, my name is ${this.name}`;
  }
}

const john = new Person("John", 30);
const alice = new Person("Alice", 25);

console.log(john.greet());  // "Hello, my name is John"
console.log(alice.age);  // 25
Cách tạo Object Ưu điểm Nhược điểm
Object Literal ({}) Dễ hiểu, ngắn gọn Không linh hoạt khi tạo nhiều Object cùng cấu trúc
new Object() Tạo Object động Dài dòng, ít được sử dụng
Constructor Function Tạo Object linh hoạt, có thể kế thừa Không tối ưu bộ nhớ nếu không dùng prototype
Class (ES6+) Cú pháp rõ ràng, hỗ trợ kế thừa Không linh hoạt khi tạo Object đơn giản

Mỗi cách có ưu và nhược điểm riêng, tùy vào nhu cầu mà lập trình viên chọn cách phù hợp nhất. Trong phần tiếp theo, chúng ta sẽ tìm hiểu cách truy cập và thao tác với Object trong JavaScript.

Truy cập và thao tác với Object trong JavaScript

Trong JavaScript, Object có nhiều cách để truy cập, cập nhật và xóa dữ liệu. Dưới đây là các phương pháp phổ biến giúp bạn làm việc với Object một cách hiệu quả.

Truy cập thuộc tính của Object

Có hai cách để truy cập giá trị của một thuộc tính trong Object:

  • Dùng dấu chấm (.)

  • Dùng dấu ngoặc vuông ([])

Ví dụ:

const person = {
  name: "John",
  age: 30
};

// Truy cập bằng dấu chấm
console.log(person.name); // "John"
console.log(person.age);  // 30

// Truy cập bằng dấu ngoặc vuông
console.log(person["name"]); // "John"
console.log(person["age"]);  // 30

Khi nào nên dùng dấu ngoặc vuông ([])?

Khi key của thuộc tính là một biến:

const key = "name";
console.log(person[key]); // "John"

Khi key chứa dấu cách hoặc ký tự đặc biệt:

const obj = {
  "full name": "Alice Doe"
};
console.log(obj["full name"]); // "Alice Doe"
// obj.full name; // Lỗi: Unexpected identifier

Thêm hoặc sửa thuộc tính

Bạn có thể thêm mới hoặc cập nhật thuộc tính của Object bằng cách gán giá trị trực tiếp:

Ví dụ:

const person = {
  name: "John",
  age: 30
};

// Thêm thuộc tính mới
person.city = "New York";

// Cập nhật giá trị thuộc tính
person.age = 31;

console.log(person);
// { name: "John", age: 31, city: "New York" }

Xóa thuộc tính

Dùng từ khóa delete để xóa một thuộc tính khỏi Object.

Ví dụ:

const person = {
  name: "John",
  age: 30,
  city: "New York"
};

// Xóa thuộc tính
delete person.city;

console.log(person);
// { name: "John", age: 30 }

Duyệt qua Object trong JavaScript

Để lặp qua tất cả các thuộc tính trong một Object, bạn có thể sử dụng các phương pháp sau:

Dùng for...in để duyệt Object

Vòng lặp for...in duyệt qua tất cả các thuộc tính của Object.

const person = {
  name: "John",
  age: 30,
  city: "New York"
};

for (let key in person) {
  console.log(`${key}: ${person[key]}`);
}
// Output:
// name: John
// age: 30
// city: New York

Lưu ý:
for...in duyệt qua cả thuộc tính kế thừa từ prototype.
Nếu không muốn duyệt qua thuộc tính kế thừa, dùng Object.hasOwnProperty().

for (let key in person) {
  if (person.hasOwnProperty(key)) {
    console.log(`${key}: ${person[key]}`);
  }
}

Dùng Object.keys(), Object.values(), Object.entries()

  • Object.keys(obj): Trả về mảng chứa tên thuộc tính.

  • Object.values(obj): Trả về mảng chứa giá trị thuộc tính.

  • Object.entries(obj): Trả về mảng chứa cặp [key, value].

const person = {
  name: "John",
  age: 30
};

console.log(Object.keys(person)); // ["name", "age"]
console.log(Object.values(person)); // ["John", 30]
console.log(Object.entries(person)); // [["name", "John"], ["age", 30]]

Các tính năng nâng cao của Object trong JavaScript

JavaScript hỗ trợ nhiều tính năng nâng cao giúp làm việc với Object hiệu quả hơn.

Object Destructuring (Phân rã Object)

Object Destructuring giúp trích xuất giá trị từ Object một cách nhanh chóng.

const person = {
  name: "John",
  age: 30,
  city: "New York"
};

// Destructuring
const { name, age } = person;

console.log(name); // "John"
console.log(age);  // 30

Có thể đổi tên biến khi destructuring:

const { name: fullName, age: yearsOld } = person;
console.log(fullName, yearsOld); // "John", 30

Đặt giá trị mặc định:

const { country = "USA" } = person;
console.log(country); // "USA"

Spread và Rest Operator (...)

  • Spread (...): Dùng để sao chép hoặc kết hợp Object.

  • Rest (...): Dùng để tách phần còn lại của Object.

Ví dụ: Sao chép Object bằng Spread

const person = { name: "John", age: 30 };
const person2 = { ...person, city: "New York" };

console.log(person2); 
// { name: "John", age: 30, city: "New York" }
Ví dụ: Tách phần còn lại của Object bằng Rest
const { name, ...rest } = person2;
console.log(name);  // "John"
console.log(rest);  // { age: 30, city: "New York" }

Object.freeze()Object.seal()

Object.freeze(obj)

Ngăn chặn việc thêm, sửa, hoặc xóa thuộc tính trong Object.

const person = { name: "John" };
Object.freeze(person);

person.name = "Alice"; // Không thay đổi
person.city = "New York"; // Không thêm được
delete person.name; // Không xóa được

console.log(person); // { name: "John" }

Object.seal(obj)

Ngăn chặn thêm hoặc xóa thuộc tính, nhưng vẫn cho phép sửa giá trị.

const person = { name: "John" };
Object.seal(person);

person.name = "Alice"; // OK, có thể sửa
person.city = "New York"; // Không thêm được
delete person.name; // Không xóa được

console.log(person); // { name: "Alice" }

Kết bài

Object là một trong những khái niệm quan trọng và cốt lõi trong JavaScript, đóng vai trò nền tảng cho việc lưu trữ và xử lý dữ liệu. Việc hiểu rõ cách tạo, truy cập, thao tác và quản lý Object sẽ giúp lập trình viên xây dựng mã nguồn hiệu quả, dễ bảo trì và tối ưu hơn.

Bên cạnh những phương pháp cơ bản như sử dụng object literal, constructor function, class, JavaScript cũng cung cấp nhiều tính năng nâng cao như Object Destructuring, Spread/Rest Operator, Object.freeze() và Object.seal() để giúp việc thao tác với Object trở nên linh hoạt và an toàn hơn.

Nắm vững các kiến thức này không chỉ giúp bạn viết mã gọn gàng hơn mà còn tối ưu hiệu suất trong các dự án thực tế. Hãy thực hành thường xuyên để làm chủ Object trong JavaScript và áp dụng vào các bài toán thực tế một cách hiệu quả nhất!

Bài viết liên quan