2009-11-20 61 views
7

Nguyên mẫu cho lớp JavaScript là gì? Nói cách khác, sự khác biệt giữaNguyên mẫu trong JavaScript là gì?

Example.prototype.method {} 

Example.method{} 

khi định nghĩa lớp Ví dụ là gì?

Edit: Đối với những người quan tâm, tôi tìm thấy một lời giải thích tuyệt vời (ngoài các câu trả lời dưới đây) vào đây để sự khác biệt giữa các phương pháp lớp học và phương pháp xây dựng: http://idhana.com/2009/07/13/constructor-vs-class-methods-in-javascript/

Chỉnh sửa 2: Câu trả lời đầy đủ! http://blog.anselmbradford.com/2009/04/09/object-oriented-javascript-tip-creating-static-methods-instance-methods/

Trả lời

5

Sự khác biệt là trong ví dụ sau, bạn đang tạo phương thức tĩnh, không được kế thừa nếu Example là hàm dựng. Bằng cách xác định các thuộc tính trong thuộc tính prototype của hàm dựng và tạo đối tượng với từ khóa new, các đối tượng mới được tạo ra kế thừa nguyên mẫu của hàm tạo và do đó có quyền truy cập vào các phương thức đó.

Một ví dụ sẽ là phương pháp quy định tại được xây dựng trong nhà xây dựng cốt lõi, chẳng hạn như String .. chuỗi mới được tạo ra có một phương pháp indexOf vì đã có một định nghĩa trong nguyên mẫu các String hàm constructor của

typeof String.prototype.indexOf // 'function' 

var name = 'John'; 
alert(name.indexOf('J')) // 0 

Các code bên dưới tạo hàm tạo hàm, đầu tiên chúng ta định nghĩa một phương thức tĩnh, tạo một đối tượng, tìm đối tượng không có phương thức getName, sau đó chúng ta định nghĩa một phương thức trong nguyên mẫu và thấy rằng đối tượng hiện có phương thức getName.

function Name(name) { 
    this.name = name; 
}; 
Name.getName = function(){}; 

var john = new Name(); 
typeof john.getName // undefined 

var john = new Name(); 
Name.prototype.getName = function(){ alert(this.name)}; 
typeof john.getName 

john.constructor.prototype.getName == john.getName // true 

Vì vậy, để nhắc lại, thừa kế trong ECMAScript được thực hiện chủ yếu bằng cách định nghĩa các thuộc tính/phương pháp trong nguyên mẫu của một nhà xây dựng chức năng, ví dụ sẽ là tất cả các nhà thầu cốt lõi như Ngày/Số/String mà có phương pháp quy định tại của họ các thuộc tính nguyên mẫu tương ứng, cho phép bạn sử dụng các phương thức đó khi bạn tạo một cá thể với từ khóa new.

Hãy nhớ rằng đối tượng mới được tạo có thuộc tính constructor trỏ đến hàm tạo đã tạo và chúng tôi có thể truy cập trực tiếp thuộc tính prototype. Đối tượng john mà chúng ta đã tạo không trực tiếp sở hữu phương thức getName, vì trình thông dịch không thể tìm thấy trực tiếp trên đối tượng mà nó di chuyển lên trên hàm tạo và tìm nó trong nguyên mẫu của nó. Và btw, chúng tôi đã không thực sự phải tạo một thể hiện mới của đối tượng john, như được chỉ ra trong câu trả lời khác, bạn có thể xác định các thuộc tính trong nguyên mẫu sau khi bạn tạo hàm khởi tạo ban đầu và tất cả các đối tượng sẽ kế thừa các nguyên mẫu đó các thuộc tính ngay cả sau khi chúng được tạo ra.

Một phương pháp tĩnh không thể dựa vào bối cảnh, không thể dựa vào một trường hợp cụ thể của một lớp, không thể dựa vào các từ khóa this do đó điều này sẽ không phải là một phương pháp tĩnh:

function Name(name) { 
    this.name = name; 
    this.getName = function() { return this.name; } 
}; 

sẽ này là một ví dụ về một phương pháp tĩnh:

Name.getName = function() {}; 

nhưng hoàn toàn không có ý nghĩa trong việc đưa ra getName tĩnh vì như tên của nó nó phải dựa trên một trường hợp đối tượng để xác định những thuộc tính tên là, bạn nên có gener hơn Các hàm trợ giúp ic như các hàm phân tích cú pháp như Date.parse như các phương thức tĩnh và xác định các phương thức mẫu trong nguyên mẫu khi chúng hiệu quả hơn việc xác định this.foo = function(){} trong hàm tạo.

+0

vì vậy khi nào tôi muốn sử dụng Name.getName = function() {}? – sepiroth

+0

hoặc đúng hơn, khi nào tôi có thể xác định phương thức (và cách) cho lớp Tên mà không sử dụng định nghĩa mẫu? – sepiroth

+0

'getName' sẽ là một phương thức công khai để bạn định nghĩa nó trên nguyên mẫu chứ không phải tĩnh, bạn sẽ định nghĩa một phương thức tĩnh nếu không có mục đích để làm cho nó công khai hoặc trong nguyên mẫu. –

2

Nguyên mẫu giống như định nghĩa Lớp, nhưng nó có thể được thay đổi động. Bất cứ khi nào bạn khởi tạo một đối tượng của một loại nào đó, nó sử dụng nguyên mẫu làm mẫu.

Nếu bạn thay đổi nguyên mẫu, đối tượng thuộc loại đó sẽ có những thay đổi đó.

Các vấn đề liên quan