5. Đối tượng trong JavaScript

Tất cả mọi thứ trong JS đều là object, trừ undefined. Thật vậy. Cho dù typeof của chúng đôi khi không phải lúc nào cũng là “object”.

1) Các object dựng sẵn.

Theo cách hiểu của một php developer thì PDO là một class dựng sẵn trong ngôn ngữ, khi cần dùng chỉ cần $x = new PDO(), trong JS cũng có các “class” dựng sẵn như vậy, ở đây gọi là các đối tượng dựng sẵn, gồm Number, Boolean, String, Array, Date, Math, RegExp có mặt ở bất cứ hệ điều hành nào.

Tương tự như trên php, khi khởi tạo object, ta chỉ cần dùng new Objectname (hoặc ClassName như trong PHP). Chú ý, trong ES6 của JavaScript, ta cũng có thể viết class và khởi tạo new ClassName như trong PHP. Sẽ được viết ở dưới.

Ví dụ: let x = new Number(10). (Tuy nhiên, đây không phải là cách hay để tạo object so với việc khai báo let x = 10).

Thử tạo ra một biến/object mới với cú pháp new String(“string”);

Kết quả không khác gì so với khi khai báo dạng biến mà typeof là “String” như ở dưới (cách 2). Xem sự giống và khác nhau giữa 2 cách khai báo qua ảnh sau:

2. Các biến tạo ra đều là object, có sẵn các method.

Giờ thay vì let x = new String(“Vượng”), ta thử với let x = “Vượng” như ở dưới.

Một ví dụ khác với number.

3. Các object tạo ra dùng 2 cách {} hoặc new Object

Có 2 cách tạo object trong Javascript, khai biến bình thường và dùng {}, hoặc new Object().

[js]
var vidu = {};
var vidu2 = new Object();
[/js]

Ngoài ra, như ở cách 1 trình bày trên, JS còn có các “class” (“Object”) dựng sẵn.

[js]
var books = new Array("C++", "Perl", "Java"); // tạo object từ các "Class/Object" nguyên thủy thiên tôn
var day = new Date("August 15, 1947"); // // tạo object từ các "Class/Object" nguyên thủy thiên tôn. Trong PHP có DateTime()
[/js]

Object() Constructor

Muốn tạo một object mới, ta có thể dùng constructor Object, ví dụ var x = new Object();. Trong JS, ngoài Number, Boolean, String, Array, Date, Math, RegExp là các class/object thiên tôn mà ta có thể tạo các object tương ứng thì Object, một dạng “class” ông tổ của tất cả.

Tuy nhiên, khi khởi tạo object bằng {} và bằng new Object thì các thuộc tính và phương thức gốc là như nhau.

Object nguyên thủy thiên tôn Prototype

So sánh các method có sẵn khi dùng cách tạo biến từ hai phương pháp.

Chú ý: phương pháp tạo object từ Object.create(null) sẽ không có các method nguyên thủy thiên tôn (mặc định)

4. Các object tạo ra từ function hoặc class( ES6)

Trong JS, function cũng giúp tạo một “class” ảo và khởi tạo object từ chính function đó với từ khóa “new”. Quan sát ví dụ:

[js]
// Khởi tạo một hàm, hàm này đóng vai trò là "constructor function", giống với một class.
function JS(name, level) {
this.name = name;
this.level = level;
}
// Khởi tạo một object từ hàm constructor
let a = new JS(‘Vượng’, 1);
//Nếu chúng ta console.log(a) kết quả sẽ như sau:
Hero {name: "Vượng", level: 1}
[/js]

Class từ ES6

Từ ES6, ta có thể tạo class như các ngôn ngữ khác. Tuy nhiên, typeof của class vẫn là “function”. Xem ví dụ:

Kết luận quan trọng:

Hầu hết các object trong JavaScript là instances của Object. Các object này đều sẽ kế thừa thuộc tính và phương thức từ nguyên mẫu thiên tôn Object.prototype, mặc dù các thuộc tính và phương thức này có thể bị ghi đè ghi xây dựng. Nếu muốn xây dựng một object thuần túy, không kế thừa bất cứ thuộc tính hay phương thức nào từ Object, ta dùng Object.create(null)

Ghi đè Prototype

Dưới đây là ví dụ cụ thể.

Đây là ví dụ khác về sửa prototype của Object, String và Number. Có thể thấy Object ==> ảnh hưởng đến object tạo từ class và function, String ảnh hưởng tới object string và Number cũng chỉ ảnh hưởng tới object number vậy.

Khi thay đổi prototype của Object nguyên thủy thì prototype của object tạo từ class và function sẽ thay đổi theo.

Lưu ý là khi gọi phương thức hoặc thuộc tính của đối tượng trên JS, trình tự gọi là từ chính class/function mà nó được tạo ra, tiếp đến nếu không có sẽ truy về các “class” cụ tổ như Number, Array, String… và cuối cùng nếu không có sẽ gọi tới Object.prototype.

Điều đó cũng đồng nghĩa, nếu thay đổi từ Object.prototype thì tất cả mọi thứ sẽ thay đổi theo.

Tóm lại, tất cả mọi thứ có trên JS đều bắt nguồn từ một dạng “class” ảo cụ tổ là Object và đều mang theo methods, properties của cụ, trừ trường hợp tạo object bằng phương pháp Object.create(null) thì các object tạo ra sẽ trống trơn.

Nếu object tạo từ (hoặc biến dạng) String nó sẽ mang theo những đặc trưng của cụ tổ String nữa.

Nếu object tạo từ (hoặc biến dạng) Number nó sẽ mang theo những đặc trưng của cụ tổ Number nữa.

Nếu object tạo từ (hoặc biến dạng) Array nó sẽ mang theo những đặc trưng của cụ tổ Array nữa.

Vân vân và mây mây.

Tham khảo:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/prototype

https://techmaster.vn/posts/34858/tao-object-trong-javascript-huong-doi-tuong

https://www.digitalocean.com/community/tutorials/understanding-prototypes-and-inheritance-in-javascript

https://kipalog.com/posts/LAP-TRINH-HUONG-DOI-TUONG-CUNG-JAVASCRIPT

JavaScript Objects in Detail

Leave a Comment