Object-in-javascript

Object trong JavaScript

Mình vừa thi cuối kì môn OS ở trường xong, cũng coi như kết thúc một kì học với một đống Assignment và lab. Bây giờ là thời gian để học thêm một thứ gì đó mới mẻ ngoài mấy cái môn học hại não ở trường. Series bài viết về JavaSript sẽ là ghi chép của mình về nhưng thứ làm mình cảm thấy hay hay trong quá trình tìm hiểu JavaScript. Vì là những ghi chép của mình nên có thể sẽ có nhiều chỗ sai sót hay chưa đúng kiến thức, mình xin nhận mọi gạch đá từ bạn đọc để hoàn thiện kiến thức, tránh việc sau này viết code lung tung. Mình bắt đầu với một thứ mình thấy nó hơi kì kì: Objects


Object là gì?

Nếu bạn đã học lập trình hướng đối tượng thì sẽ biết Objects và Classes.  Trong các ngôn ngữ hướng đối tượng như C#, Java, …. có thể hiểu đơn giản Object là một mô hình của một thực thể hay khái niệm trong thế giới thực. Mỗi Object có một tập các thuộc tính và hành vi.  Class là tập hợp các đối tượng có đặc điểm tương tự nhau, mỗi lớp là đặc tả các đặc điểm của các đối tượng thuộc lớp đó. Class là khuôn mẫu để tạo nên các Object thuộc về Class đó.

Nhưng, trong JavaScript KHÔNG có khái niệm class mà chỉ có khái niệm Object (cá nhân mình thấy nó hơi ….. :v). JavaScript chả cần cái class nào để tạo ra một object cả hay nói cách khác, có thể tạo một object trong JS mà không cần biết class của nó. Có thể hiểu object trong JS là tập hợp các các thuộc tính (property) và giá trị (value) của các thuộc tính này. Tên của thuộc tính có thể là một chuỗi bất kì trong JS kể cả chuỗi trống, giá trị của thuộc tính có thể là một giá trị hợp lệ bất kì trong JS ngoại trừ giá trị không xác định (undefined).

Ở trên mình dùng “Có thể hiểu” mà không phải là định nghĩa của object (vì mình hiểu mà chả biết viết nó ra như thế nào để đọc cho lọt miệng được :v). Phòng ngừa khi bạn ra đường mà có đứa nào cứ khăng khăng hỏi về định nghĩa của object, nếu bạn nói như trên mà nó không chịu thì quăng cái đoạn này cho nó.

“The simple types of JavaScript are numbers, strings, booleans (true and false), null, and undefined. All other values are objects. Numbers, strings, and booleans are object-like in that they have methods, but they are immutable. Objects in JavaScript are mutable keyed collections. In JavaScript, arrays are objects, functions are objects, regular expressions are objects, and, of course, objects are objects.”

– JavaScript the good parts

Suy cho cùng thì mọi thứ trong JS đều là object, chỉ có undefined và null là không phải, còn number, strings, boolean thì object-like. (đọc nó là object lai chắc đúng chuẩn luôn :v). Trong định nghĩa trên có 2 từ immutable và mutable. Bạn có thể xem trong link này: Mutable và Immutable Objects là gì?

Thuộc tính (property) của một object có thể là number, string, function, ….. và cả object nữa :v.

Trong ví dụ dưới đây thì object student có 3 thuộc tính là firstName, lastName, ID, có một thuộc tính có tên là chuỗi rỗng và có hàm là showInfo(). Câu lệnh student.showInfo();  gọi hàm showInfo() của object student.

Thấy cũng có gì đó same same như object của java hay C# nhỉ :v

Tạo object như thế nào?

Object Literal

Object constructor

Rõ thấy Object constructor sẽ làm code của chúng ta vừa dài ra và bị lặp lại nếu sử dụng để tạo các object lớn có nhiều hàm và thuộc tính. Một cái object mà to to xíu là cũng sinh chuyện rồi chứ đừng nói nhiều cái to.

Sử dụng Object Literal để tạo một object thì đơn giản và đỡ trùng lặp code hơn, nhưng nếu ta làm việc với những dự án lớn, nhiều object cùng loại thì việc sử dụng Object Literal cũng không ổn lắm.

Ví dụ như ta cần tạo thêm vài thằng student tương tự như thằng lam_student kia thì phải ngồi gõ mớ code gần như i chang nhau chỉ khác mỗi cái giá trị của mấy thuộc tính. Lúc đó đống code của chúng ta nhìn sẽ khá là ngớ ngẩn :v.

Đến đây thì mình bắt đầu muốn một thứ gì đó giống như cái class có constructor trong mấy ngôn ngữ OOP (dùng new phát một ra luôn :v). Và tin vui là trong JS chúng ta có thể sử dụng một hàm (function) bình thường để làm constructor, người ta hay gọi nó là Constructor pattern. Với thứ này, ta có thể khắc phục vấn đề mình đề cập trên kia.

Rõ ràng sử dụng Constructor pattern làm cho công việc tạo các object đơn giản hơn nhiều, code ngắn, dễ coi, dễ debug. Như thế thì thằng dev nào chả thích :v

Bạn có thể xem rõ hơn về Constructor pattern ở bài viết này: Constructor, operator “new”

Ta còn có thể tạo object bằng prototype, nhưng prototype là một vấn đề khá lớn nên mình sẽ nói về nó ở một bài viết khác.

Thao tác với Object

Truy xuất các thành phần của Object

Có 2 cách để truy xuất đến thuộc tính của object: sử dụng dấu ‘ . ‘ (dot notation) và dấu [ ] (bracket  notation) để truy xuất đến các thuộc tính của object. Thông thường người ta hay dùng dấu chấm ( ‘ . ‘) nhưng trong các trường hợp tên thuộc tính kiểu như “first-name”, “last-name” … thì sử dụng dấu chấm để truy xuất sẽ gây ra lỗi, lúc này ta phải sử dụng dấu [ ] để truy xuất. À, còn cả tên thuộc tính mà là chuỗi rỗng như ở ví dụ đầu tiên nữa, cũng phải dùng dấu [ ]. Có một sự thật là dấu [ ] còn làm được nhiều cái hay ho khác mà mình chưa ví dụ được trong bài viết này.

Sửa, thêm, xoá thuộc tính cho object

Với JS, ta có thể thay đổi giá trị các thuộc tính, thêm thuộc tính, cho một object đã tạo.

Một số trò khác

Tham khảo (reference)

Trong đoạn code trên, JS không copy lamStudent gán vào someone. 

Duyệt các thuộc tính.

Ta có thể dùng toán tử typeof  để xác định kiểu dữ liệu của một thuộc tính trong object.


Bài viết về Object kết thúc ở đây, hi vọng nó sẽ giúp ích cho bạn nào đang tìm hiểu về JS hoặc bị Object nó nhây :v

Leave a Reply

Your email address will not be published. Required fields are marked *