Javascript

Prototype trong JavaScript

Prototype object trong javascript

Để dễ hiểu, chúng ta xem xét function sau:

function Person(firstName, lastName) {

this.firstName = firstName;

this.lastName = lastName;

}

Khi Function Person được tạo, mặc định nó sẽ có một Property có tên là Prototype (lưu ý là function trong JavaScript cũng là một Object). Property này là một Object mà ban đầu chỉ có chứa một Property là Constructor trỏ ngược lại function Person. Và khi function Person này được gọi với từ khóa New, Object mới được tạo sẽ kế thừa tất cả các Property từ Peron.prototype. Để kiểm tra, chúng ta thêm vào Person.prototype một Method là showFullName() như sau:

Person.prototype.showFullName = function() {

console.log(this.firstName ' ' this.lastName);

}

var justin = new Person('Justin', 'Vo');

console.log(justin); // Person {firstName: "Justin", lastName: "Vo"}

justin.showFullName(); // Justin Vo

Người ta còn gọi Person.prototype là Prototype Object hay gọn hơn là Prototype của Object Justin, cũng như bất kì Object nào được tạo với cú pháp new Person(...).

var david = new Person('David', 'Truong');

console.log(david); // Person {firstName: "David", lastName: "Truong"}

david.showFullName(); // David Truong

Thật ra chúng ta có thể khai báo Method showFullName() ngay bên trong function Person. Tuy nhiên, do Method showFullName() là giống nhau ở mọi Object, nên chúng ta đưa nó lên Person.prototype để các object kế thừa lại (nguyên lý Don't Repeat Yourself - DRY). Và đó cũng là một trong số các Best Practice trong JavaScript: constructor chỉ khởi tạo các Property riêng biệt cho mỗi Object được tạo, còn các Method áp dụng chung cho mọi Object sẽ được tạo ở Prototype.

function Person(firstName, lastName) {

this.firstName = firstName;

this.lastName = lastName;

this.friends = [];

}

Person.prototype.showFullName = function() {

console.log(this.firstName ' ' this.lastName);

}

Person.prototype.addFriend = function(friend) {

this.friends.push(friend);

}

var vancanh = new Person('Canh', 'Dinh');

var justin = new Person('Justin', 'Vo');

var micheal = new Person('Micheal', 'Huynh');

console.log(vancanh.friends); // [];

vancanh.addFriend(justin);

vancanh.addFriend(micheal);

console.log(vancanh.friends); // [Person, Person]

Các Object mặc định có sẵn trong JavaScript cũng được xây dựng theo cách tương tự như trên. Ví dụ, Prototype của các Object được tạo với cú pháp New Object() hoặc {} là Object.prototype, các Array được tạo với cú pháp New Array() hoặc [] là Array.prototype và tương tự như thế cho các Object khác như RegExp hay Date. Object.prototype được kế thừa bởi mọi Object và bản thân nó không có Prototype (nói cách khác, prototype của nó là null).

Thực tế thì chúng ta không thể truy cập được Prototype của một Object và cũng không cần thiết phải dùng đến nó, tuy nhiên, chẳng hạn như trong Chrome, nó cho phép chúng ta truy cập vào Prototype của một Object thông qua một property "giả" là __proto__.

Ảnh 5.

Prototype chain

Cơ chế Prototype Chain rất đơn giản: khi chúng ta truy cập vào một Property của một Object, JavaScript Engine sẽ tìm Property đó bên trong chính Object, nếu không có nó sẽ tìm lên trên Prototype của Object và cứ tiếp tục như thế cho đến khi gặp Object.prototype thì dừng và cho ra kết quả (undefined nếu không tìm thấy). 

Ví dụ:

var obj1 = { a: 1 };

var obj2 = Object.create(obj1);

obj2.b = 2;

console.log(obj1.a); // 1

console.log(obj2.a); // 1

console.log(obj2.b); // 2

console.log(obj2.c); // undefined

Trong ví dụ trên, Object.create() sẽ tạo một Object mới Obj2 với Prototype là obj1. Và như đã thấy, mặc dù Obj2 không có Property a, nhưng chúng ta vẫn có thể truy cập nó nhờ vào cơ chế Prototype Chain.

Kết

Mình xin tạm dừng bài viết tại đây vì có lẽ đã khá dài. Trên đây mình đã cố gắng trình bày về Prototype theo cách dễ hiểu. Hi vọng qua bài viết này sẽ giúp bạn hiểu hơn về khái niệm Prototype trong JavaScript.

>> Xem thêm: JavaScript khi Object được tạo từ hư vô

Registration Login
Sign in with social account
or
Lost your Password?
Registration Login
Sign in with social account
or
A password will be send on your post
Registration Login
Registration