2010-02-16 33 views
5

Tôi đang bối rối về khái niệm "nguyên mẫu" trong javascript.Khi nào bạn nên sử dụng "nguyên mẫu" trong khi tăng thêm đối tượng trong javascript?

Khi tôi xác định một đối tượng cả những điều sau đây có vẻ làm việc:

myObject = {}; 
myObject.prototype.method1 = function() { ... }; 
myObject.prototype.method2 = function() { ... }; 
myObject.prototype.method3 = function() { ... }; 

và ...

myObject = {}; 
myObject.method1 = function() { ... }; 
myObject.method2 = function() { ... }; 
myObject.method3 = function() { ... }; 

thể bất cứ ai làm sáng tỏ về điều này? Chính xác thì sự khác biệt giữa hai cách tạo ra một đối tượng là gì và tại sao tôi lại chọn một đối tượng khác? (Tôi có cảm giác này trong ruột của tôi, điều quan trọng là ...)

Cảm ơn!

Trả lời

8

Bạn nên sử dụng prototype tài sản duy nhất trên Constructor Functions, không phải trong trường hợp đối tượng, ví dụ:

function Test() {} 
Test.prototype.method1 = function() {/*...*/}; 

var obj = new Test(); 

Thuộc tính của chức năng constructor prototype, được sử dụng bởi các nhà điều hành new, khi nó tạo mới của chúng tôi ví dụ đối tượng.

Tất cả các đối tượng gốc đều có liên kết ẩn, tạo nên chuỗi nguyên mẫu.

Liên kết ẩn giữa các đối tượng này là thuộc tính nội bộ [[Prototype]] và nhà điều hành new là người duy nhất có thể đặt nó.

Trong ví dụ trên, các obj có liên quan đến nội bộ với nguyên mẫu constructor của nó, các method1 có thể truy cập từ obj, nhưng nó không tồn tại vật lý trên đối tượng này, phương pháp mà tồn tại trên các đối tượng Test.prototype, và nó lấy qua chuỗi nguyên mẫu, ví dụ:

typeof obj.method1; // "function" 
obj.hasOwnProperty('method1'); // false 
obj.method1 === Test.prototype.method1; // true 

Mở trường hợp đối tượng, gán thuộc tính prototype là vô nghĩa, nó sẽ được thực hiện cũng giống như bất kỳ tên thuộc tính khác:

var myObject = {}; 
myObject.prototype = "foo"; 
myObject.bar = "bar"; 

// myObject is simply {"prototype":"foo","bar":"bar"} 
+0

Sẽ thêm nhiều lần sẽ có các phương thức được thêm vào bên trong cho mỗi cá thể bên trong hàm Constructor qua: this.fn = function() {...}; đó là hữu ích cho việc có các biến cá thể riêng được truy cập bởi các phương thức cá thể. – Tracker1

1

Cách thứ hai chỉ thêm các phương thức cho đối tượng này. Cách đầu tiên làm cho nó có sẵn cho các đối tượng khác được tạo ra với new với "loại" này.

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