2012-03-09 23 views
9

Tôi đã xem qua bài này http://www.webmasterworld.com/javascript/3066162.htm về cách javascript khi bạn khởi tạo đối tượng theo nghĩa đen nếu nó có phương thức được xác định trong đó. vì vậy nếu bạn có một loạt các trường hợp của đối tượng theo nghĩa đen thì các phương thức sao chép sẽ bắt đầu thêm vào bộ nhớ.đối tượng chữ ký hiệu và tốc độ nguyên mẫu và bộ nhớ

bao giờ anh/cô ấy nói rằng sử dụng nguyên mẫu để làm cho phương pháp của bạn hiệu quả hơn bởi vì các phương thức không được sao chép cho mỗi trường hợp của đối tượng hàm tạo.

điều này có đúng không? bởi vì tôi đã được ấn tượng rằng nguyên mẫu cho phép bạn thêm các thuộc tính/phương thức ngay cả sau khi đối tượng được khởi tạo hơn là trong đối tượng khi nó được tạo đầu tiên.

+2

Tôi chỉ muốn lưu ý rằng việc tạo phương thức từ bên trong hàm tạo không thực sự tạo một bản sao mới của toàn bộ phương thức trong bộ nhớ - một tham chiếu mới được thực hiện đơn giản với phương thức hiện có.Tuy nhiên, nguyên mẫu vẫn có xu hướng nhanh hơn vì tất cả điều này được xử lý bởi công cụ JavaScript và vì vậy nó có thể thực hiện rất nhiều tối ưu hóa trên đường, nhanh chóng trở nên đáng chú ý khi bạn khởi tạo hàng chục nghìn đối tượng. Google tối ưu hóa crap ra khỏi chuỗi nguyên mẫu trong V8, đó là một phần lý do tại sao nó quá nhanh. –

+0

@ musicfreak khác nhau rất tốt để biết, cảm ơn người đàn ông. – zero

Trả lời

10

Đó là sự thật, đó là lý do tại sao có một prototype.

// define Function foo 
function Foo() 
{ 
    this.x = 1; 
    this.bar = 'bar'; 
} 

// define method on Foo's prototype 
Foo.prototype.helloBar = function() 
{ 
    alert(this.bar); 
} 


var foobar = new Foo(); 

foobar.helloBar(); // alerts "bar" 

Sử dụng Foo.prototype ngăn chặn các bit thêm không cần thiết liên quan đến xác định lại hellobar cho mỗi trường hợp new Foo().

+0

tôi đoán tôi đang bối rối. là nguyên mẫu gì đó mà mỗi cá thể của đối tượng tham chiếu đến (giống như gọi hàm) – zero

+3

@codewombat: Đúng vậy. Đối tượng 'prototype' được chia sẻ giữa tất cả các đối tượng được tạo ra từ cùng một hàm tạo. Họ * tham khảo * với nó để truy cập các thuộc tính mà họ không tự sở hữu. –

+0

Trong trường hợp này, *** tất cả các đối tượng của hàm Foo ***. – xandercoded

14

Khi bạn tạo một đối tượng như thế này:

function Car(c) { 
    this.color = c; 
    this.drive = function() {}; 
} 

Bạn đang thực sự tạo ra một bản sao của hàm ổ đĩa cho mỗi xe mà bạn tạo. Trong Javascript, mọi đối tượng đều có một con trỏ nguyên mẫu và các thuộc tính/phương thức từ nguyên mẫu đó truyền bá cây cho các đối tượng con.

Khi bạn làm:

function Car(c) {this.color=c}; 
Car.prototype.drive = function {}; 

và sau đó tạo ra một vài xe các đối tượng bạn kết thúc với thay này:

 
      {drive: function(){}} 
      /  |   \ 
     car1 (red) car2 (blue) car3 (green) 

Chức năng drive được chia sẻ giữa tất cả các đối tượng xe. Đó là một sự xấu hổ cú pháp để làm điều này trong Javascript là rất khó xử.

+0

⇈ Đây là câu trả lời hay. – Daniel

1

Xác định các phương pháp trên nguyên mẫu hàm của hàm tạo là tương tự với định nghĩa lớp bằng các ngôn ngữ khác. Các phương thức được định nghĩa trong một lớp Java, ví dụ, được chia sẻ bởi tất cả các cá thể của lớp đó. Các phương thức được định nghĩa trên nguyên mẫu hàm của hàm tạo, trong Javascript, được chia sẻ bởi tất cả các cá thể được tạo từ hàm hàm dựng đó.

Sự khác biệt chính trong ví dụ trên là khai báo biến. Một biến được định nghĩa trên một mẫu thử nghiệm sẽ được chia sẻ giữa các trường hợp khi mọi cá thể của một lớp sẽ có bản sao riêng của các biến trong định nghĩa lớp.

Cách dễ nhất để hiểu là trải qua một số thử nghiệm. http://jsfiddle.net/3vn4A/

Trong đối tượng Firefox có thể truy cập trực tiếp mẫu thử của mình qua con trỏ __proto__. Object.getPrototypeOf(obj) là cách tiêu chuẩn để một đối tượng lập trình tham chiếu đến nguyên mẫu của nó.

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