Phần lớn những gì bạn làm khi viết phần mềm là tạo và kết nối nhiều giá trị và phương thức hoạt động cùng nhau để cung cấp chức năng cho ứng dụng của bạn. Lập trình hướng đối tượng giúp bạn đạt được và thực hiện điều này một cách dễ dàng và khai báo hơn nhiều
Trong bài viết này, bạn sẽ tìm hiểu mọi thứ bạn cần biết để bắt đầu sử dụng các lớp và phương pháp lập trình hướng đối tượng trong JavaScript
Hãy xem xét những gì bạn cần để tận dụng tối đa bài viết này
điều kiện tiên quyết
Để làm theo hướng dẫn này, bạn cần có kiến thức cơ bản về JavaScript
Lập trình hướng đối tượng
Lập trình hướng đối tượng [OOP] là một mô hình lập trình được các nhà phát triển sử dụng để cấu trúc các ứng dụng phần mềm thành các đoạn mã và bản thiết kế có thể tái sử dụng bằng cách sử dụng các đối tượng. OOP được sử dụng hàng ngày trong các dự án lớn, phức tạp và được bảo trì tích cực
OOP giúp việc tạo và quản lý nhiều phần trong ứng dụng của bạn trở nên dễ dàng hơn và kết nối chúng mà không khiến chúng phụ thuộc vào nhau. Tiếp theo, hãy xem xét bốn khái niệm chính của OOP
trừu tượng
Trừu tượng hóa trong OOP là quá trình chỉ hiển thị các chức năng cần thiết cho người dùng trong khi ẩn các hoạt động phức tạp bên trong để làm cho chương trình dễ sử dụng và dễ hiểu hơn
Ví dụ: khi bạn gửi tin nhắn trên điện thoại, tất cả các chức năng và logic định tuyến tin nhắn của bạn đến người khác sẽ bị ẩn vì bạn không cần biết chúng hoặc cách chúng hoạt động
Tương tự như vậy, trong lập trình, nếu bạn đang xây dựng một API giúp các ứng dụng tài chính xác minh danh tính người dùng và thông tin ngân hàng, thì các nhà phát triển sử dụng API của bạn không cần biết bạn sử dụng hệ thống cơ sở dữ liệu nào hoặc cách bạn gọi cơ sở dữ liệu của mình. Tất cả những gì họ cần biết là chức năng họ cần gọi và những thông số họ cần cung cấp
Tính trừu tượng giúp giảm độ phức tạp, tăng khả năng sử dụng và làm cho các thay đổi đối với ứng dụng ít gây gián đoạn hơn
đóng gói
Đóng gói là quá trình gói mã liên quan vào một đơn vị duy nhất. Đóng gói làm cho các phần khác của mã không thể thao tác hoặc thay đổi cách thức hoạt động của phần được đóng gói của ứng dụng trừ khi bạn đi vào đơn vị đó một cách rõ ràng và thay đổi chúng
Ví dụ: nếu bạn đang xây dựng API đặt vé máy bay, bạn nên tách mã tìm kiếm chuyến bay khỏi mã đặt chuyến bay. Bằng cách này, hai nhà phát triển khác nhau có thể làm việc liền mạch trên từng phần mà không có xung đột vì mỗi nhà phát triển sẽ không có lý do gì để thao túng trực tiếp mã của người kia
Đóng gói giúp bạn giảm độ phức tạp và tăng khả năng sử dụng lại mã
Di sản
Tính kế thừa trong OOP giúp giảm trùng lặp mã, cho phép bạn xây dựng một phần ứng dụng của mình trên ứng dụng khác bằng cách kế thừa các thuộc tính và phương thức từ phần đó của ứng dụng
Ví dụ: khi xây dựng một ứng dụng giao hàng thương mại điện tử với nhiều loại phương tiện, các lớp
const job = {
role: "Software Engineer",
'salary': 200000,
applicationLink: "meta.com/careers/SWE-role/apply",
isRemote: true,
};
6 và const job = {
role: "Software Engineer",
'salary': 200000,
applicationLink: "meta.com/careers/SWE-role/apply",
isRemote: true,
};
7 có thể kế thừa các hàm const job = {
role: "Software Engineer",
'salary': 200000,
applicationLink: "meta.com/careers/SWE-role/apply",
isRemote: true,
};
8 và const job = {
role: "Software Engineer",
'salary': 200000,
applicationLink: "meta.com/careers/SWE-role/apply",
isRemote: true,
};
9 từ lớp console.log[job[role]]; // returns 'Software Engineer'
0. Các lớp sẽ được giải thích chi tiết hơn sau trong bài viếtMột lợi thế đáng kể của tính kế thừa trong OOP là giảm trùng lặp mã
đa hình
Trong lập trình, tính đa hình là một thuật ngữ dùng để mô tả một đoạn mã hoặc chương trình có thể xử lý nhiều loại dữ liệu bằng cách trả về phản hồi hoặc kết quả dựa trên dữ liệu đã cho.
Ví dụ: bạn có một biểu mẫu được sử dụng để thêm sản phẩm vào danh mục sản phẩm và ba loại sản phẩm khác nhau. Với tính đa hình, bạn có thể tạo một phương thức lớp duy nhất để định dạng tất cả các loại sản phẩm trước khi thêm chúng vào cơ sở dữ liệu
Tính đa hình giúp bạn loại bỏ các câu lệnh
console.log[job[role]]; // returns 'Software Engineer'
1 và console.log[job[role]]; // returns 'Software Engineer'
2 phức tạp và không cần thiết, vì chúng có thể trở nên dài dòng khi viết các chương trình phức tạpHãy xem xét các đối tượng JavaScript trong phần tiếp theo
Đối tượng JavaScript
Một đối tượng trong JavaScript là một tập hợp các cặp khóa-giá trị không theo thứ tự, còn được gọi là thuộc tính và giá trị. Các khóa đối tượng có thể là một giá trị chuỗi, trong khi các giá trị có thể là bất kỳ loại nào. Dưới đây là một số ví dụ
- Sợi dây
- Con số
- Boolean
- Mảng
- Chức năng
Tiếp theo, hãy xem cách tạo đối tượng trong JavaScript
Tạo đối tượng
Tạo một đối tượng trong JavaScript khá dễ dàng
const car = {
name: 'Ford',
year: 2015,
color: 'red',
description: function [] {
return `${this.name} - ${this.year} - ${this.color}`;
}
}
Đoạn mã trên khai báo một đối tượng
console.log[job[role]]; // returns 'Software Engineer'
3 với các thuộc tính của nó là console.log[job[role]]; // returns 'Software Engineer'
4, console.log[job[role]]; // returns 'Software Engineer'
5, console.log[job[role]]; // returns 'Software Engineer'
6 và một hàm console.log[job[role]]; // returns 'Software Engineer'
7Truy cập thuộc tính đối tượng
Có hai cách để truy cập thuộc tính đối tượng trong JavaScript;
Sử dụng ký hiệu dấu chấm
Ví dụ sau đây cho thấy cách truy cập các thuộc tính đối tượng bằng cách sử dụng ký hiệu dấu chấm
const country = {
name: 'Spain',
population: 4000000,
description: function [] {
return `${this.name} - ${this.population}`;
}
}
Nếu bạn có một đối tượng giống như đối tượng được hiển thị ở trên, bạn có thể sử dụng định dạng
console.log[job[role]]; // returns 'Software Engineer'
8, định dạng này sẽ trả về giá trị của khóa đã choconsole.log[country.name]; // returns 'Spain'
Sử dụng ký hiệu mảng
Ví dụ sau đây cho thấy cách truy cập các thuộc tính đối tượng bằng cách sử dụng ký hiệu mảng
const job = {
role: "Software Engineer",
'salary': 200000,
applicationLink: "meta.com/careers/SWE-role/apply",
isRemote: true,
};
Nếu bạn có một đối tượng như ở trên, bạn có thể sử dụng định dạng
console.log[job[role]]; // returns 'Software Engineer'
9 sẽ trả về giá trị của khóa đã choconsole.log[job[role]]; // returns 'Software Engineer'
Ngoài ra, bạn chỉ có thể truy cập thuộc tính
console.log[job.'salary']; // SyntaxError: Unexpected string
0 bằng cách sử dụng ký hiệu mảng. Cố gắng lấy nó bằng ký hiệu dấu chấm sẽ trả về lỗiconsole.log[job.'salary']; // SyntaxError: Unexpected string
Tiếp theo, hãy xem cách sửa đổi thuộc tính đối tượng
Sửa đổi thuộc tính đối tượng
Bạn có thể tự động thêm, chỉnh sửa và xóa các thuộc tính của đối tượng trong JavaScript
Chỉnh sửa thuộc tính
Bạn có thể sử dụng toán tử gán
console.log[job.'salary']; // SyntaxError: Unexpected string
1 để sửa đổi các giá trị đối tượng. Đây là một ví dụconst person = {
name: "John",
age: 30,
job: "Software Developer",
country: "Nigeria",
car: "Ford",
description: function [] {
return `${this.name} - ${this.age} - ${this.job.role} - ${this.country.name} - ${this.car.name}`;
},
};
Bạn cũng có thể thay đổi giá trị của
console.log[job[role]]; // returns 'Software Engineer'
4 trong đối tượng trênperson.name = "Smith Doe";
console.log[person.name]; // returns "Smith Doe"
Thêm thuộc tính mới
Một trong những điểm khác biệt đáng kể giữa đối tượng trong các ngôn ngữ khác và đối tượng trong JavaScript là khả năng thêm thuộc tính mới vào đối tượng sau khi tạo
Để thêm thuộc tính mới vào đối tượng, bạn sử dụng ký hiệu dấu chấm
// adding a new `race` property
person.race = "Asian";
console.log[person.race]; // returns "Asian"
Đoạn mã trên thêm một thuộc tính
console.log[job.'salary']; // SyntaxError: Unexpected string
3 mới với giá trị "Asian"Xóa thuộc tính đối tượng
JavaScript cho phép bạn xóa các thuộc tính khỏi một đối tượng bằng cách sử dụng từ khóa
console.log[job.'salary']; // SyntaxError: Unexpected string
4delete person.race;
console.log[person.race]; // returns 'undefined'
Đoạn mã trên xóa thuộc tính
console.log[job.'salary']; // SyntaxError: Unexpected string
3 và truy cập thuộc tính console.log[job.'salary']; // SyntaxError: Unexpected string
3 sẽ trả về không xác địnhGhi chú. Bạn chỉ có thể xóa các thuộc tính đối tượng hiện có
Kiểm tra thuộc tính
Trước khi thêm hoặc xóa các thuộc tính khỏi một đối tượng, bạn nên xác định xem thuộc tính đó có tồn tại trên đối tượng hay không. Kiểm tra có vẻ đơn giản này sẽ giúp bạn tiết kiệm hàng giờ để gỡ lỗi do các giá trị trùng lặp gây ra
Để xác định xem một thuộc tính có tồn tại trên một đối tượng hay không, bạn có thể sử dụng từ khóa
console.log[job.'salary']; // SyntaxError: Unexpected string
7const country = {
name: 'Spain',
population: 4000000,
description: function [] {
return `${this.name} - ${this.population}`;
}
}
0Đoạn mã trên trả về
console.log[job.'salary']; // SyntaxError: Unexpected string
8 cho tên kiểm tra vì tên tồn tại và console.log[job.'salary']; // SyntaxError: Unexpected string
9 cho thuộc tính console.log[job.'salary']; // SyntaxError: Unexpected string
3 đã bị xóaBây giờ bạn đã biết đối tượng là gì và cách sử dụng chúng, hãy thực hiện bước tiếp theo với OOP trong JavaScript bằng cách tìm hiểu về các lớp
Các lớp học
Trong lập trình, một lớp là một cấu trúc được định nghĩa bởi một lập trình viên, sau đó được sử dụng để tạo nhiều đối tượng cùng loại. Ví dụ: nếu bạn đang xây dựng một ứng dụng xử lý nhiều loại ô tô khác nhau, bạn có thể tạo một lớp
const job = {
role: "Software Engineer",
'salary': 200000,
applicationLink: "meta.com/careers/SWE-role/apply",
isRemote: true,
};
6 có các chức năng và thuộc tính thiết yếu áp dụng cho tất cả các loại ô tô. Sau đó, bạn có thể sử dụng lớp này để tạo các ô tô khác và thêm các thuộc tính và phương thức dành riêng cho từng phương tiện cho chúngĐể mở rộng các đối tượng bạn đã thấy trong ví dụ trước, nếu bạn muốn tạo một đối tượng công việc khác, bạn sẽ cần tạo một đối tượng như thế này
const country = {
name: 'Spain',
population: 4000000,
description: function [] {
return `${this.name} - ${this.population}`;
}
}
1Tuy nhiên, như bạn có thể thấy, cách tạo nhiều đối tượng ở trên dễ bị lỗi và không thể mở rộng vì bạn không thể tạo 100 đối tượng công việc bằng cách viết ra mỗi khi bạn cần tạo công việc. Đây là nơi các lớp học có ích
Tạo lớp học
Bạn có thể tạo một lớp
const person = {
name: "John",
age: 30,
job: "Software Developer",
country: "Nigeria",
car: "Ford",
description: function [] {
return `${this.name} - ${this.age} - ${this.job.role} - ${this.country.name} - ${this.car.name}`;
},
};
2 để đơn giản hóa việc tạo nhiều công việcconst country = {
name: 'Spain',
population: 4000000,
description: function [] {
return `${this.name} - ${this.population}`;
}
}
2Đoạn mã trên tạo một lớp
const person = {
name: "John",
age: 30,
job: "Software Developer",
country: "Nigeria",
car: "Ford",
description: function [] {
return `${this.name} - ${this.age} - ${this.job.role} - ${this.country.name} - ${this.car.name}`;
},
};
2 với các thuộc tính const person = {
name: "John",
age: 30,
job: "Software Developer",
country: "Nigeria",
car: "Ford",
description: function [] {
return `${this.name} - ${this.age} - ${this.job.role} - ${this.country.name} - ${this.car.name}`;
},
};
4, console.log[job.'salary']; // SyntaxError: Unexpected string
0, const person = {
name: "John",
age: 30,
job: "Software Developer",
country: "Nigeria",
car: "Ford",
description: function [] {
return `${this.name} - ${this.age} - ${this.job.role} - ${this.country.name} - ${this.car.name}`;
},
};
6 và const person = {
name: "John",
age: 30,
job: "Software Developer",
country: "Nigeria",
car: "Ford",
description: function [] {
return `${this.name} - ${this.age} - ${this.job.role} - ${this.country.name} - ${this.car.name}`;
},
};
7. Bây giờ bạn có thể tạo các công việc khác nhau bằng cách sử dụng từ khóa const person = {
name: "John",
age: 30,
job: "Software Developer",
country: "Nigeria",
car: "Ford",
description: function [] {
return `${this.name} - ${this.age} - ${this.job.role} - ${this.country.name} - ${this.car.name}`;
},
};
8const country = {
name: 'Spain',
population: 4000000,
description: function [] {
return `${this.name} - ${this.population}`;
}
}
3Đoạn mã trên tạo ra hai công việc khác nhau với tất cả các trường bắt buộc. Hãy xem cách này có hiệu quả không bằng cách in cả hai lệnh ra trong bảng điều khiển
const country = {
name: 'Spain',
population: 4000000,
description: function [] {
return `${this.name} - ${this.population}`;
}
}
4Đoạn mã trên sẽ in ra cả hai công việc trong bảng điều khiển
Hình ảnh hiển thị cả hai công việc và tất cả thuộc tính của chúng trong bảng điều khiển
Từ khóa const person = {
name: "John",
age: 30,
job: "Software Developer",
country: "Nigeria",
car: "Ford",
description: function [] {
return `${this.name} - ${this.age} - ${this.job.role} - ${this.country.name} - ${this.car.name}`;
},
};
9
const person = {
name: "John",
age: 30,
job: "Software Developer",
country: "Nigeria",
car: "Ford",
description: function [] {
return `${this.name} - ${this.age} - ${this.job.role} - ${this.country.name} - ${this.car.name}`;
},
};
Từ khóa
const person = {
name: "John",
age: 30,
job: "Software Developer",
country: "Nigeria",
car: "Ford",
description: function [] {
return `${this.name} - ${this.age} - ${this.job.role} - ${this.country.name} - ${this.car.name}`;
},
};
9 được coi là từ khóa khó hiểu nhất trong JavaScript vì nó có nghĩa khác nhau tùy thuộc vào vị trí xuất hiện trong mã của bạnTrong ví dụ trên, từ khóa
const person = {
name: "John",
age: 30,
job: "Software Developer",
country: "Nigeria",
car: "Ford",
description: function [] {
return `${this.name} - ${this.age} - ${this.job.role} - ${this.country.name} - ${this.car.name}`;
},
};
9 đề cập đến bất kỳ đối tượng nào được tạo bằng lớp const person = {
name: "John",
age: 30,
job: "Software Developer",
country: "Nigeria",
car: "Ford",
description: function [] {
return `${this.name} - ${this.age} - ${this.job.role} - ${this.country.name} - ${this.car.name}`;
},
};
2. Do đó, bên trong phương thức person.name = "Smith Doe";
console.log[person.name]; // returns "Smith Doe"
3, person.name = "Smith Doe";
console.log[person.name]; // returns "Smith Doe"
4 có nghĩa là "xác định thuộc tính const person = {
name: "John",
age: 30,
job: "Software Developer",
country: "Nigeria",
car: "Ford",
description: function [] {
return `${this.name} - ${this.age} - ${this.job.role} - ${this.country.name} - ${this.car.name}`;
},
};
4 của đối tượng này mà bạn đang tạo dưới dạng bất kỳ giá trị nào được cung cấp cho hàm tạo"Ngoài ra, lưu ý rằng các giá trị ban đầu bạn cung cấp phải theo thứ tự khi tạo một đối tượng Công việc mới. Ví dụ bạn tạo một đối tượng
person.name = "Smith Doe";
console.log[person.name]; // returns "Smith Doe"
6 như vậyconst country = {
name: 'Spain',
population: 4000000,
description: function [] {
return `${this.name} - ${this.population}`;
}
}
5Đoạn mã trên tạo một đối tượng
person.name = "Smith Doe";
console.log[person.name]; // returns "Smith Doe"
6 mới với thứ tự sai của các thuộc tính và thiếu thuộc tính const person = {
name: "John",
age: 30,
job: "Software Developer",
country: "Nigeria",
car: "Ford",
description: function [] {
return `${this.name} - ${this.age} - ${this.job.role} - ${this.country.name} - ${this.car.name}`;
},
};
7. Bạn sẽ nhận được một cái gì đó như thế này trong bảng điều khiểnHình ảnh trên cho thấy đối tượng
person.name = "Smith Doe";
console.log[person.name]; // returns "Smith Doe"
6 sẽ trông như thế nào khi được in ra trong bảng điều khiển. Lưu ý rằng const person = {
name: "John",
age: 30,
job: "Software Developer",
country: "Nigeria",
car: "Ford",
description: function [] {
return `${this.name} - ${this.age} - ${this.job.role} - ${this.country.name} - ${this.car.name}`;
},
};
7 là // adding a new `race` property
person.race = "Asian";
console.log[person.race]; // returns "Asian"
1Trong phần tiếp theo, hãy xem cách thêm phương thức vào lớp
phương pháp lớp
Khi tạo lớp, bạn có thể thêm bao nhiêu thuộc tính tùy thích. Ví dụ: nếu bạn có một lớp
console.log[job[role]]; // returns 'Software Engineer'
0, ngoài các thuộc tính cơ bản như // adding a new `race` property
person.race = "Asian";
console.log[person.race]; // returns "Asian"
3, console.log[job[role]]; // returns 'Software Engineer'
6, // adding a new `race` property
person.race = "Asian";
console.log[person.race]; // returns "Asian"
5 và console.log[job[role]]; // returns 'Software Engineer'
5, bạn có thể cũng muốn có các phương thức như // adding a new `race` property
person.race = "Asian";
console.log[person.race]; // returns "Asian"
7, // adding a new `race` property
person.race = "Asian";
console.log[person.race]; // returns "Asian"
8, // adding a new `race` property
person.race = "Asian";
console.log[person.race]; // returns "Asian"
9 và delete person.race;
console.log[person.race]; // returns 'undefined'
0Để thêm các phương thức bên trong các lớp, bạn có thể thêm chúng sau hàm
person.name = "Smith Doe";
console.log[person.name]; // returns "Smith Doe"
3const country = {
name: 'Spain',
population: 4000000,
description: function [] {
return `${this.name} - ${this.population}`;
}
}
6Đoạn mã trên định nghĩa một lớp Xe với các thuộc tính
// adding a new `race` property
person.race = "Asian";
console.log[person.race]; // returns "Asian"
3, console.log[job[role]]; // returns 'Software Engineer'
6, // adding a new `race` property
person.race = "Asian";
console.log[person.race]; // returns "Asian"
5 và console.log[job[role]]; // returns 'Software Engineer'
5, cũng như các phương thức // adding a new `race` property
person.race = "Asian";
console.log[person.race]; // returns "Asian"
7, // adding a new `race` property
person.race = "Asian";
console.log[person.race]; // returns "Asian"
8, // adding a new `race` property
person.race = "Asian";
console.log[person.race]; // returns "Asian"
9 và delete person.race;
console.log[person.race]; // returns 'undefined'
0Để chạy các phương thức trên đối tượng, bạn có thể sử dụng ký hiệu dấu chấm
const country = {
name: 'Spain',
population: 4000000,
description: function [] {
return `${this.name} - ${this.population}`;
}
}
7Đoạn mã trên tạo ra hai loại phương tiện sử dụng lớp
console.log[job[role]]; // returns 'Software Engineer'
0 và chạy các phương thức của lớp trên chúngHãy xem xét các thuộc tính được tính toán trong phần tiếp theo
Thuộc tính được tính toán
Lập trình phần lớn phụ thuộc vào việc thay đổi giá trị, vì vậy tương tự như cách bạn không muốn mã hóa cứng hầu hết các giá trị của thuộc tính lớp, bạn có thể có một số tên thuộc tính động thay đổi dựa trên một số giá trị. Bạn có thể sử dụng các thuộc tính được tính toán để làm điều đó;
Ví dụ: khi tạo API danh sách việc làm, bạn có thể muốn nhà phát triển có thể thay đổi tên hàm
const country = {
name: 'Spain',
population: 4000000,
description: function [] {
return `${this.name} - ${this.population}`;
}
}
01 thành một từ khác, chẳng hạn như const country = {
name: 'Spain',
population: 4000000,
description: function [] {
return `${this.name} - ${this.population}`;
}
}
02 hoặc const country = {
name: 'Spain',
population: 4000000,
description: function [] {
return `${this.name} - ${this.population}`;
}
}
03, tùy thuộc vào nền tảng của họ. Để sử dụng các thuộc tính được tính toán, bạn cần đặt tên thuộc tính trong dấu ngoặc vuôngconst country = {
name: 'Spain',
population: 4000000,
description: function [] {
return `${this.name} - ${this.population}`;
}
}
8Đoạn mã trên khai báo biến
const country = {
name: 'Spain',
population: 4000000,
description: function [] {
return `${this.name} - ${this.population}`;
}
}
01 với giá trị chuỗi là const country = {
name: 'Spain',
population: 4000000,
description: function [] {
return `${this.name} - ${this.population}`;
}
}
05 và một phương thức tính toán const country = {
name: 'Spain',
population: 4000000,
description: function [] {
return `${this.name} - ${this.population}`;
}
}
06 có thể được gọi là const country = {
name: 'Spain',
population: 4000000,
description: function [] {
return `${this.name} - ${this.population}`;
}
}
07Các thuộc tính được tính toán giúp các nhà phát triển khác tùy chỉnh mã của họ dễ dàng hơn
Getters và Setters
Khi viết mã trong một nhóm, bạn muốn giới hạn những người có thể thay đổi một số phần nhất định của cơ sở mã để tránh lỗi. Nên ẩn một số biến và thuộc tính nhất định trong OOP khi cần thiết
Tiếp theo, hãy tìm hiểu cách thức hoạt động của các từ khóa
const country = {
name: 'Spain',
population: 4000000,
description: function [] {
return `${this.name} - ${this.population}`;
}
}
08 và const country = {
name: 'Spain',
population: 4000000,
description: function [] {
return `${this.name} - ${this.population}`;
}
}
09Getters
Khi xây dựng ứng dụng quan tâm đến việc đảm bảo quyền riêng tư của người dùng, chẳng hạn như ứng dụng quản lý các vấn đề pháp lý, bạn muốn kiểm soát ai có thể truy cập dữ liệu của người dùng như tên, email và địa chỉ. Từ khóa
const country = {
name: 'Spain',
population: 4000000,
description: function [] {
return `${this.name} - ${this.population}`;
}
}
08 giúp bạn đạt được điều này. Bạn có thể giới hạn những người có thể truy cập thông tinconst country = {
name: 'Spain',
population: 4000000,
description: function [] {
return `${this.name} - ${this.population}`;
}
}
9Đoạn mã trên khai báo một lớp Client với các thuộc tính
console.log[job[role]]; // returns 'Software Engineer'
4 và const country = {
name: 'Spain',
population: 4000000,
description: function [] {
return `${this.name} - ${this.population}`;
}
}
12 và một getter chỉ trả về tên nếu người dùng là Luật sư. Nếu cố truy cập vào tên đó với tư cách Trợ lý, bạn sẽ gặp lỗiconsole.log[country.name]; // returns 'Spain'
0Ghi chú.
13 được đổi thànhconst country = { name: 'Spain', population: 4000000, description: function [] { return `${this.name} - ${this.population}`; } }
14 để tránh xung đột đặt tênconst country = { name: 'Spain', population: 4000000, description: function [] { return `${this.name} - ${this.population}`; } }
Hãy tìm hiểu về setters tiếp theo
người định cư
Từ khóa
const country = {
name: 'Spain',
population: 4000000,
description: function [] {
return `${this.name} - ${this.population}`;
}
}
09 ngược lại với từ khóa const country = {
name: 'Spain',
population: 4000000,
description: function [] {
return `${this.name} - ${this.population}`;
}
}
08. Từ khóa const country = {
name: 'Spain',
population: 4000000,
description: function [] {
return `${this.name} - ${this.population}`;
}
}
08 được sử dụng để kiểm soát ai có thể truy cập thuộc tính, trong khi từ khóa const country = {
name: 'Spain',
population: 4000000,
description: function [] {
return `${this.name} - ${this.population}`;
}
}
09 kiểm soát ai có thể thay đổi giá trị của thuộc tínhĐể tìm hiểu cách thức hoạt động của từ khóa
const country = {
name: 'Spain',
population: 4000000,
description: function [] {
return `${this.name} - ${this.population}`;
}
}
09, hãy mở rộng ví dụ trước bằng cách thêm một setterconsole.log[country.name]; // returns 'Spain'
1Đoạn mã trên khai báo một phương thức
const country = {
name: 'Spain',
population: 4000000,
description: function [] {
return `${this.name} - ${this.population}`;
}
}
09 chỉ cho phép thay đổi tên nếu người dùng là Luật sư và các tài liệu đã được xác minhconsole.log[country.name]; // returns 'Spain'
2Ghi chú. Các phương thức có tiền tố là các phương thức
08 vàconst country = { name: 'Spain', population: 4000000, description: function [] { return `${this.name} - ${this.population}`; } }
09 được gọi lần lượt là các hàm getter và setterconst country = { name: 'Spain', population: 4000000, description: function [] { return `${this.name} - ${this.population}`; } }
Tiếp theo, chúng ta hãy xem các thuộc tính và phương thức tĩnh
Giá trị tĩnh
Đôi khi bạn muốn tạo các thuộc tính và phương thức được liên kết với các lớp chứ không phải các thể hiện của lớp. Ví dụ: bạn có thể muốn một thuộc tính đếm số lượng máy khách trong cơ sở dữ liệu, nhưng bạn không muốn giá trị đó bị ràng buộc với các thể hiện của lớp
Hãy xem xét các thuộc tính tĩnh tiếp theo
Thuộc tính tĩnh
Để theo dõi số lượng khách hàng trong cơ sở dữ liệu, bạn có thể sử dụng từ khóa
const country = {
name: 'Spain',
population: 4000000,
description: function [] {
return `${this.name} - ${this.population}`;
}
}
23console.log[country.name]; // returns 'Spain'
3Đoạn mã trên khai báo một thuộc tính tĩnh
const country = {
name: 'Spain',
population: 4000000,
description: function [] {
return `${this.name} - ${this.population}`;
}
}
24 với giá trị là const country = {
name: 'Spain',
population: 4000000,
description: function [] {
return `${this.name} - ${this.population}`;
}
}
25. Bạn có thể truy cập các thuộc tính tĩnh như thế nàyconsole.log[country.name]; // returns 'Spain'
4Ghi chú. Cố gắng truy cập các thuộc tính tĩnh bằng cách sử dụng
26 sẽ trả về không xác định vì các thuộc tính tĩnh được liên kết với lớp chứ không phải đối tượngconst country = { name: 'Spain', population: 4000000, description: function [] { return `${this.name} - ${this.population}`; } }
Tiếp theo, hãy xem xét các phương thức tĩnh
Phương thức tĩnh
Tạo các phương thức tĩnh rất giống với việc tạo các thuộc tính tĩnh vì bạn chỉ cần thêm tiền tố vào tên phương thức bằng từ khóa
const country = {
name: 'Spain',
population: 4000000,
description: function [] {
return `${this.name} - ${this.population}`;
}
}
23console.log[country.name]; // returns 'Spain'
5Đoạn mã trên khai báo một phương thức tĩnh
const country = {
name: 'Spain',
population: 4000000,
description: function [] {
return `${this.name} - ${this.population}`;
}
}
28 làm tăng giá trị const country = {
name: 'Spain',
population: 4000000,
description: function [] {
return `${this.name} - ${this.population}`;
}
}
24 mỗi khi nó được gọiCác phương thức và thuộc tính tĩnh giúp dễ dàng tạo các hàm trợ giúp và tiện ích có thể được sử dụng trực tiếp trên lớp chứ không phải các phiên bản
Giá trị riêng tư
Bản cập nhật được cung cấp với sự hỗ trợ cho các giá trị riêng tư bên trong các lớp JavaScript
Các trường và phương thức riêng đưa tính đóng gói trong các lớp lên cấp độ tiếp theo vì giờ đây bạn có thể tạo các thuộc tính và phương thức chỉ có thể được sử dụng bên trong dấu ngoặc nhọn khai báo lớp và bất kỳ mã nào bên ngoài các dấu ngoặc nhọn đó sẽ không thể truy cập chúng
Tiếp theo hãy xem xét các thuộc tính riêng tư
Thuộc tính riêng tư
Bạn có thể khai báo các thuộc tính riêng tư bên trong một lớp bằng cách đặt trước biến bằng dấu
const country = {
name: 'Spain',
population: 4000000,
description: function [] {
return `${this.name} - ${this.population}`;
}
}
30. Hãy cải thiện lớp const country = {
name: 'Spain',
population: 4000000,
description: function [] {
return `${this.name} - ${this.population}`;
}
}
31 trong các phần bằng cách thêm một id duy nhất cho mọi khách hàngconsole.log[country.name]; // returns 'Spain'
6Đoạn mã trên đã khai báo một biến
const country = {
name: 'Spain',
population: 4000000,
description: function [] {
return `${this.name} - ${this.population}`;
}
}
32 riêng chỉ có thể được sử dụng và truy cập bên trong khai báo lớp. Cố gắng truy cập nó bên ngoài lớp sẽ trả về lỗiconsole.log[country.name]; // returns 'Spain'
7Hãy xem xét các phương pháp riêng tư tiếp theo
Phương pháp riêng tư
Như đã đề cập trước đó, các phương thức riêng tư chỉ có thể truy cập được bên trong khai báo lớp. Để tìm hiểu cách thức hoạt động của các phương thức riêng tư, chúng tôi sẽ thêm một phương thức riêng tư để tìm nạp tài liệu tệp trường hợp khách hàng từ cơ sở dữ liệu
console.log[country.name]; // returns 'Spain'
8Mã ở trên hiện có thể được sử dụng bên trong chức năng công khai mà người dùng sẽ gọi để lấy tài liệu khách hàng. Bản chất của chức năng riêng tư là ẩn tất cả các xác thực cơ bản và các lệnh gọi tới cơ sở dữ liệu khỏi người dùng hoặc nhà phát triển sử dụng mã
Ghi chú. Bạn cũng có thể tạo các hàm tĩnh, getter và setter riêng tư
Tiếp theo, chúng ta hãy tìm hiểu cách xâu chuỗi các phương thức của lớp trong phần tiếp theo
Chuỗi phương pháp
Là một nhà phát triển, một trong những điều bạn có thể thích làm nhất là triển khai một tính năng sử dụng càng ít mã càng tốt. Bạn có thể làm điều này trong JavaScript bằng các phương thức xâu chuỗi. Ví dụ: khi người dùng đăng nhập vào ứng dụng của bạn, bạn muốn thay đổi trạng thái của người dùng thành 'trực tuyến' và khi họ đăng xuất, bạn thay đổi lại thành 'ngoại tuyến'
console.log[country.name]; // returns 'Spain'
9Đoạn mã trên khai báo một lớp
const country = {
name: 'Spain',
population: 4000000,
description: function [] {
return `${this.name} - ${this.population}`;
}
}
33 với các thuộc tính const country = {
name: 'Spain',
population: 4000000,
description: function [] {
return `${this.name} - ${this.population}`;
}
}
34 và const country = {
name: 'Spain',
population: 4000000,
description: function [] {
return `${this.name} - ${this.population}`;
}
}
35 và các phương thức const country = {
name: 'Spain',
population: 4000000,
description: function [] {
return `${this.name} - ${this.population}`;
}
}
36, const country = {
name: 'Spain',
population: 4000000,
description: function [] {
return `${this.name} - ${this.population}`;
}
}
37, const country = {
name: 'Spain',
population: 4000000,
description: function [] {
return `${this.name} - ${this.population}`;
}
}
38 và const country = {
name: 'Spain',
population: 4000000,
description: function [] {
return `${this.name} - ${this.population}`;
}
}
39. Để xâu chuỗi các phương thức, bạn có thể sử dụng ký hiệu dấu chấmconst job = {
role: "Software Engineer",
'salary': 200000,
applicationLink: "meta.com/careers/SWE-role/apply",
isRemote: true,
};
0Đoạn mã trên sẽ chạy tuần tự tất cả các chức năng trên đối tượng
const country = {
name: 'Spain',
population: 4000000,
description: function [] {
return `${this.name} - ${this.population}`;
}
}
40 và trả về một phản hồiHình ảnh hiển thị kết quả của chuỗi phương thức
Ghi chú. Bạn cần trả về đối tượng hiện tại bằng cách trả về
9 ở cuối mỗi chức năngconst person = { name: "John", age: 30, job: "Software Developer", country: "Nigeria", car: "Ford", description: function [] { return `${this.name} - ${this.age} - ${this.job.role} - ${this.country.name} - ${this.car.name}`; }, };
Tiếp theo, hãy xem cách xây dựng trên các lớp hiện có thông qua kế thừa
Kế thừa lớp
Khi làm việc với các đối tượng, rất có thể bạn sẽ gặp phải các tình huống cần tạo một đối tượng thực sự giống với một đối tượng đã tồn tại trong mã của bạn, nhưng bạn biết rằng chúng không thể giống nhau. Ví dụ: khi xây dựng một ứng dụng thương mại điện tử, bạn sẽ có một lớp
const country = {
name: 'Spain',
population: 4000000,
description: function [] {
return `${this.name} - ${this.population}`;
}
}
42 với các thuộc tính như console.log[job[role]]; // returns 'Software Engineer'
4, const country = {
name: 'Spain',
population: 4000000,
description: function [] {
return `${this.name} - ${this.population}`;
}
}
44, console.log[job[role]]; // returns 'Software Engineer'
7, và const country = {
name: 'Spain',
population: 4000000,
description: function [] {
return `${this.name} - ${this.population}`;
}
}
46 và các phương thức như const country = {
name: 'Spain',
population: 4000000,
description: function [] {
return `${this.name} - ${this.population}`;
}
}
47 và const country = {
name: 'Spain',
population: 4000000,
description: function [] {
return `${this.name} - ${this.population}`;
}
}
48Tuy nhiên, nếu bạn có nhiều loại sản phẩm với các thông số kỹ thuật khác nhau thì sao?
- Sách có tác giả, trọng lượng và chi tiết trang
- Nội thất với các chi tiết chiều dài, chiều rộng, chiều cao và loại gỗ
- Phim CD với kích thước, thời lượng và chi tiết nội dung
Trong trường hợp này, việc tạo một lớp cho mỗi sản phẩm sẽ dẫn đến nhiều mã trùng lặp, đây là một trong những quy tắc chính của OOP và lập trình nói chung - không lặp lại chính mình [DRY]
Kế thừa lớp cho phép bạn tạo các đối tượng dựa trên các đối tượng khác. Ví dụ: bạn có thể giải quyết vấn đề được đề cập ở trên bằng cách tạo một lớp
const country = {
name: 'Spain',
population: 4000000,
description: function [] {
return `${this.name} - ${this.population}`;
}
}
42const job = {
role: "Software Engineer",
'salary': 200000,
applicationLink: "meta.com/careers/SWE-role/apply",
isRemote: true,
};
1Sau đó, tạo một phân lớp cho từng loại sản phẩm bằng cách sử dụng từ khóa
const country = {
name: 'Spain',
population: 4000000,
description: function [] {
return `${this.name} - ${this.population}`;
}
}
50const job = {
role: "Software Engineer",
'salary': 200000,
applicationLink: "meta.com/careers/SWE-role/apply",
isRemote: true,
};
2Đoạn mã trên tuyên bố các loại sản phẩm
const country = {
name: 'Spain',
population: 4000000,
description: function [] {
return `${this.name} - ${this.population}`;
}
}
51, const country = {
name: 'Spain',
population: 4000000,
description: function [] {
return `${this.name} - ${this.population}`;
}
}
52 và const country = {
name: 'Spain',
population: 4000000,
description: function [] {
return `${this.name} - ${this.population}`;
}
}
53 bằng cách mở rộng lớp const country = {
name: 'Spain',
population: 4000000,
description: function [] {
return `${this.name} - ${this.population}`;
}
}
42Có hai từ khóa mới trong đoạn mã trên.
const country = {
name: 'Spain',
population: 4000000,
description: function [] {
return `${this.name} - ${this.population}`;
}
}
50 và const country = {
name: 'Spain',
population: 4000000,
description: function [] {
return `${this.name} - ${this.population}`;
}
}
56. Hãy xem xét chúng trong các phần tiếp theoTừ khóa const country = {
name: 'Spain',
population: 4000000,
description: function [] {
return `${this.name} - ${this.population}`;
}
}
50
const country = {
name: 'Spain',
population: 4000000,
description: function [] {
return `${this.name} - ${this.population}`;
}
}
Từ khóa
const country = {
name: 'Spain',
population: 4000000,
description: function [] {
return `${this.name} - ${this.population}`;
}
}
50 là tự giải thích; . Trong trường hợp của chúng tôi, chúng tôi đã sử dụng nó để tạo các lớp const country = {
name: 'Spain',
population: 4000000,
description: function [] {
return `${this.name} - ${this.population}`;
}
}
51, const country = {
name: 'Spain',
population: 4000000,
description: function [] {
return `${this.name} - ${this.population}`;
}
}
52 và const country = {
name: 'Spain',
population: 4000000,
description: function [] {
return `${this.name} - ${this.population}`;
}
}
53 bằng cách mở rộng lớp const country = {
name: 'Spain',
population: 4000000,
description: function [] {
return `${this.name} - ${this.population}`;
}
}
42Từ khóa const country = {
name: 'Spain',
population: 4000000,
description: function [] {
return `${this.name} - ${this.population}`;
}
}
56
const country = {
name: 'Spain',
population: 4000000,
description: function [] {
return `${this.name} - ${this.population}`;
}
}
Từ khóa
const country = {
name: 'Spain',
population: 4000000,
description: function [] {
return `${this.name} - ${this.population}`;
}
}
56 loại bỏ nhiều khai báo mà nếu không bạn sẽ cần phải lặp lại cho mỗi lớp con mới. Ví dụ: hàm const country = {
name: 'Spain',
population: 4000000,
description: function [] {
return `${this.name} - ${this.population}`;
}
}
56 được gọi trong đoạn mã trên đã thay thế đoạn mã sauconst job = {
role: "Software Engineer",
'salary': 200000,
applicationLink: "meta.com/careers/SWE-role/apply",
isRemote: true,
};
3Nhớ KHÔ?
Có thể bỏ qua hàm
const country = {
name: 'Spain',
population: 4000000,
description: function [] {
return `${this.name} - ${this.population}`;
}
}
56 nếu lớp con không cần hàm tạoconst job = {
role: "Software Engineer",
'salary': 200000,
applicationLink: "meta.com/careers/SWE-role/apply",
isRemote: true,
};
4Đoạn mã trên khai báo một lớp cha mẹ
const country = {
name: 'Spain',
population: 4000000,
description: function [] {
return `${this.name} - ${this.population}`;
}
}
68 và một lớp con const country = {
name: 'Spain',
population: 4000000,
description: function [] {
return `${this.name} - ${this.population}`;
}
}
69 không cần hàm tạo để hoạt động vì nó không khai báo bất kỳ biến mới nào bên trong hàm tạo. Do đó, đoạn mã sau sẽ hoạt độngconst job = {
role: "Software Engineer",
'salary': 200000,
applicationLink: "meta.com/careers/SWE-role/apply",
isRemote: true,
};
5Đoạn mã trên sẽ hoạt động ngay cả khi không có gì giống như
console.log[job[role]]; // returns 'Software Engineer'
4, console.log[job[role]]; // returns 'Software Engineer'
6 hoặc const country = {
name: 'Spain',
population: 4000000,
description: function [] {
return `${this.name} - ${this.population}`;
}
}
72 bên trong lớp const country = {
name: 'Spain',
population: 4000000,
description: function [] {
return `${this.name} - ${this.population}`;
}
}
69Bạn không cần gọi
const country = {
name: 'Spain',
population: 4000000,
description: function [] {
return `${this.name} - ${this.population}`;
}
}
56 hoặc lặp lại hàm tạo tương tự nếu bạn chỉ thêm các phương thức vào lớp conPhần kết luận
Trong hướng dẫn này, bạn đã học về lập trình hướng đối tượng và các lớp trong JavaScript và cách nó giúp giữ cho mã của bạn sạch sẽ, KHÔ và có thể tái sử dụng. Chúng tôi đã đề cập đến bốn khái niệm cốt lõi của lập trình hướng đối tượng, bao gồm tính trừu tượng, tính đóng gói, tính kế thừa và tính đa hình
Bạn cũng đã học được rằng việc sử dụng các mô hình và lớp lập trình hướng đối tượng trong mã của bạn có rất nhiều lợi thế, từ việc cải thiện cấu trúc ứng dụng và khả năng sử dụng lại mã để giảm độ phức tạp của mã