2012-01-17 30 views
8

Tôi hiện đang đọc 'Javascript Tốt Phần', và tôi đi qua các đoạn tiếp theoCuộc sống đối tượng trong mã javascript sử dụng kế thừa nguyên mẫu là gì?

Nếu chúng ta cố gắng để lấy một giá trị tài sản từ một đối tượng, và nếu đối tượng thiếu tên tài sản, sau đó nỗ lực Javascript để truy xuất giá trị thuộc tính từ đối tượng mẫu thử nghiệm. Và nếu đối tượng đó là thiếu tài sản, sau đó nó đi đến nguyên mẫu của nó, và như vậy cho đến khi quá trình cuối cùng đáy với Object.prototype.

Nếu tôi tạo đối tượng obj2 từ obj1 làm nguyên mẫu, điều đó có nghĩa là obj1 không thể bị hủy cho đến khi obj2 cũng nằm ngoài phạm vi không?

+0

Tôi thực sự không biết các công cụ JavaScript khác nhau triển khai nguyên mẫu như thế nào, nhưng tôi không nghĩ nó giống như một tham chiếu ** đối với một đối tượng. Nó giống như một cơ chế thừa kế, vì vậy tôi sẽ ngạc nhiên nếu một ** instance ** của obj1 là cần thiết cho obj2 tồn tại. –

Trả lời

5

Miễn là bạn đã xây dựng kế thừa của đối tượng (liên kết các nguyên mẫu), tôi không nghĩ rằng trình duyệt dựa vào các tham chiếu của bạn với đối tượng đó.

EX1:

var a = function(){}; 
a.prototype.toString = function(){return "I'm an A!";}; 
var b = new a(); 
a = undefined; 
var c = new a();// error => a is not a function any more! 
b.toString();// it works because the prototype is not destroyed, 
      // only our reference is destroyed 

EX2:

var a = function(){}; 
a.prototype.toString = function(){return "I'm an A!";}; 
var b = function(){}; 
b.prototype = new a(); 
a = undefined; 
var c = new b(); 
console.log(c+'');// It still works, although our 
        // initial prototype `a` doesn't exist any more. 

UPDATE: Hành vi này có thể liên quan đến một thực tế rằng trong javascript bạn không thể chính xác tiêu diệt một đối tượng ; bạn chỉ có thể xóa tất cả các tham chiếu đến nó. Sau đó, trình duyệt sẽ quyết định cách xử lý các đối tượng không được xử lý thông qua nó là Garbage collector.

+1

Hm, không phải là 'a' chỉ là một tham chiếu đến đối tượng đó, giống như' b.prototype' là? Có vẻ như chúng tôi vẫn có một tham chiếu. – kapa

+0

'b.prototype' là một ** instance ** của' a'. (cảm thấy từ khóa 'mới') –

+0

Như một tên ** **' b.prototype' chắc chắn là một tham chiếu **, 'new a()' trả về một tham chiếu chưa được đặt tên cho một đối tượng, có thể được gán cho một tên tham chiếu, như 'b.prototype', hoặc có thể được sử dụng một lần và sau khi được sử dụng theo cách đó nó sẽ trở thành không thể tiếp cận (nghĩa đen đi ra khỏi phạm vi). – zuba

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