2012-02-15 26 views
7

Tôi có một đối tượng JavaScript mà không một cái gì đó như thế này - sử dụng một đóng cửa để mô phỏng tin vs chức năng công cộng/biến:nguyên mẫu JS vs đóng cửa

var myCoolObject = function(x, y) { 

    var prop1 = "a cool prop1 value"; 
    var negX = x * -1; 
    var negY = y * -1; 
    var xyProduct = x * y; 

    return { 
     PublicProp1: prop1, 
     getXYProduct: function() { return xyProduct; }, 
     getNegX: function() { return negX; }, 
     getNegY: function() { return negY; } 
    } 
} 

tôi sẽ tạo ra khoảng 4000 trường hợp của đối tượng này, và từ những gì tôi đang đọc thêm chức năng thông qua prototype sẽ hiệu quả hơn so với cách thêm chúng như tôi có ở trên (vì trong ví dụ của tôi, mỗi trường hợp sẽ có riêng của nó getXYProcust(), getNegX()getNegY() chức năng

câu hỏi của tôi là gấp đôi -. là của tôi cách tiếp cận trên thực sự "không hiệu quả"? Tôi nhận ra rằng không hiệu quả là một thuật ngữ tương đối - nhưng đó là điều mà tôi có thể sẽ nhận thấy. Nếu nó không hiệu quả, làm thế nào tôi có thể thêm các chức năng đó vào prototype của myCoolObject? Tôi thử như sau:

myCoolObject.prototype.protoProp = "pppp"; 
myCoolObject.prototype.getAtMeBro = function() { return "get at me bro"; }; 
var myInstance = new myCoolObject(5, 10); 

Nhưng không phải protoProp cũng không 'getAtMeBro()' là tài sản của myInstance khi tôi kiểm tra nó.

Cảm ơn trước vì đã được trợ giúp - tôi đánh giá cao!

+0

Trình xây dựng trông như thế nào? Hãy chắc chắn rằng bạn không trả lại bất cứ điều gì (hoặc chỉ 'này'). –

+0

Tôi không chắc mình có hiểu câu hỏi này không? constructor sẽ trông giống như myCoolObject mới (5, 10) khi tôi khởi tạo nó. – MattW

+0

Không, hàm tạo là hàm được sử dụng với từ khóa 'mới' như' hàm myCoolObject() {} ' –

Trả lời

3
  1. Lời khuyên tốt nhất là dùng thử và xem. Trong các công cụ JS hiện đại, bạn sẽ thấy rằng 4.000 đối tượng là trò chơi trẻ con và không phải là vấn đề (miễn là mỗi đối tượng không nhận được quá lớn). Nếu bạn có người dùng trên IE6 và các công cụ cũ hơn, hãy chuẩn bị sẵn sàng để họ có thể đối phó với ít hơn.

    Ví dụ: nguồn cấp dữ liệu Dòng thời gian Facebook yêu cầu ~ 4000 (3992 khi tôi thử) các phần tử DOM; mỗi cái trong số này là xa hơn phức tạp hơn các đối tượng bạn đang tạo (được cấp, chúng sử dụng phương pháp mẫu thử nghiệm, nhưng chúng giữ nhiều hơn thông tin khác).

  2. Bạn không thể áp dụng mẫu thành viên riêng khi sử dụng prototype vì bạn không thể tạo đóng cửa để đóng gói cả hai. Mẫu điển hình ở đây là biểu thị thành viên riêng với số _ hàng đầu, để gợi ý ở mọi người không sử dụng nó (nhưng tất nhiên, không có gì ngăn họ làm như vậy).

+0

Cảm ơn! Tôi đã thử nó và đã không nhận thấy nhiều của một CPU hoặc bộ nhớ hit, nhưng tôi tiếp tục chạy trên các bài báo thúc đẩy việc sử dụng nguyên mẫu vì vậy tôi tự hỏi nếu tôi đang làm một sai lầm thiết kế cơ bản. Tôi sẽ gọi hàm getXYProduct() cho tất cả 4000 đối tượng trên một khoảng thời gian nào đó - khoảng 50 giây - vẫn chưa gây ra nhiều ảnh hưởng đến hiệu năng. Đối với # 2, bạn đang nói không sử dụng một đóng cửa nếu tôi muốn sử dụng nguyên mẫu - chỉ cần đổi tên người dân địa phương của tôi để bắt đầu với một _ và đặt các ý kiến ​​đe dọa/đáng sợ trong cảnh báo mọi người không sử dụng chúng? – MattW

+1

Điều tốt về việc thay đổi phương pháp tiếp cận mẫu thử nghiệm không được * quá * nhiều nỗ lực. Và có, đối với # 2 họ sẽ kết thúc được phương pháp công cộng, nhưng bình luận đáng sợ của bạn và hàng đầu '_' nên đưa mọi người ra bằng cách sử dụng chúng. – Matt

+0

Cảm ơn bạn đã nhập liệu! – MattW