2013-05-02 31 views
22

Tôi có một Mô hình sẽ "mang" (Model.validator) một phiên bản trình duyệt tính hợp lệ với nó và tôi cần Trình xác thực để có quyền truy cập vào các thuộc tính của Mô hình. Vì vậy, những gì tôi đã đưa ra là sau đâyTham chiếu vòng tròn giữa các đối tượng có thực hành không tốt?

var Validator = function(model) { 
    this.model = model; 
}; 

var Model = function() { 
    this._attributes = {}; 
    this.validator = new Validator(this); 
}; 

var model = new Model(); 

Mã này tạo ra tham chiếu vòng tròn giữa hai đối tượng đó. Đây có phải là một thực hành xấu sẽ gây ra rò rỉ bộ nhớ? Bất kỳ ý tưởng khác về cách thực hiện nó?

P.S. Tôi đã thấy các tham chiếu vòng tròn như vậy giữa các đối tượng trong phạm vi Angular.js.

+6

@ArunPJohny: trong IE6 có lẽ ... nhưng công cụ JS hiện đại là hoàn toàn có thể xử lý chu kỳ gc. – georg

+3

@ArunPJohny: Ngay cả trong IE6, nếu chúng là các đối tượng JS đơn giản và không bao gồm DOM – Bergi

+0

Lưu ý rằng tham chiếu vòng tròn sẽ gây ra các vấn đề khi nói đến serialization (thông qua 'JSON.stringify()' ví dụ) – Uriel

Trả lời

19

Loại mã này sẽ không gây rò rỉ bộ nhớ với các trình duyệt hiện tại; với tư cách là mentioned on MDN, tất cả các trình duyệt chính đều được vận chuyển bằng các GC đánh dấu và quét (có thể xử lý các chu kỳ tốt) trong một thời gian (ví dụ: Firefox đã có trình thu chu kỳ kể từ phiên bản 3). Từ quan điểm kiến ​​trúc, loại mã này giới thiệu mối liên kết chặt chẽ vừa phải giữa hai đối tượng (nếu một thay đổi ngay cả một cách nhỏ, khác cần được xem xét để xác định xem nó có cần thay đổi không) và do đó nên tránh được nếu có thể. Nhưng không có gì sai với nó.

+6

"vừa phải chặt chẽ khớp nối "- bạn có một món quà cho understatement. –

+1

@ErickRobertson: Vâng, trong các ngôn ngữ khác cũng có thừa kế dựa trên lớp, 'friend', "chỉ nhận được công việc làm dammit" phản ánh ... ít nhất ở đây bạn chỉ có thể muck xung quanh với giao diện công cộng. :-) – Jon

2

Sẽ không có bất kỳ vấn đề nào mà tôi chắc chắn. Các trình phân tích cú pháp JS của hầu hết các trình duyệt có thể làm việc với các phụ thuộc chu kỳ trong khi thu thập rác. Không còn vấn đề tiềm năng nào ở đây.

2

Sẽ không có vấn đề gì khi thu gom rác thải: bất kỳ Bộ gom rác mới nào (> IE6) sẽ xử lý các tham chiếu vòng tròn tốt!

Nó có thể là một vấn đề mặc dù nếu bạn đang làm chức năng đệ quy, hoặc in đối tượng.

Vì vậy, câu trả lời là: nó là không có vấn đề, trừ khi bạn vít lên mình :-)

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