2013-07-07 35 views
7

Giả sử tôi có thể tạo một nhà máy đối tượng như vậy:hiệu quả dung lượng lưu trữ chức năng ẩn danh

var newObj=function(x){ 
    var obj=[] 
    obj.x=x 
    obj.add=function(n){ 
    return this.x+n 
    } 
    return obj 
} 

Bây giờ giả sử tôi có thể tạo hàng trăm trường hợp của đối tượng này:

var obj1=newObj(1) 
var obj2=newObj(2) 
... 

Liệu mỗi obj1, obj2, .. lưu trữ bản sao của obj.add hoặc tất cả chúng chứa một tham chiếu đến một cá thể obj.add được lưu trong bộ nhớ?

Cảm ơn!

+0

Tôi đang tạo một ứng dụng nút với số lượng rất lớn các đối tượng rất lớn bằng cách sử dụng kỹ thuật nhà máy được hiển thị ở trên. Nó xảy ra với tôi rằng tôi có lẽ lãng phí rất nhiều không gian lưu trữ. Có vẻ như tôi nên bắt đầu điền vào các tài sản nguyên mẫu thay thế. – gloo

+0

Bạn có thể dễ dàng tìm ra bằng cách so sánh 'obj1.add === obj2.add'. –

+0

Xem http://stackoverflow.com/questions/17308446/how-big-are-javascript-function-objects – user123444555621

Trả lời

2

Cả hai objobj2 sẽ khởi tạo các bản sao của riêng số obj.add. Chúng là các biểu thức hàm được thực thi khi tạo và lưu trữ trong bộ nhớ trong suốt thời gian tồn tại của đối tượng.

Nếu bạn muốn duy trì hiệu suất, những gì bạn nên sử dụng là prototyping:

var newObj=function(x){ 
    this.obj = []; 
    this.obj.x = x; 
    return this.obj; 
} 

newObj.prototype.add = function(n) { 
    return this.obj.x += n; 
} 

này sẽ tạo ra một chức năng mà tất cả newObj đối tượng trong tương lai sẽ sử dụng mà không chiếm thêm dung lượng ở bộ nhớ cho các chức năng chính xác tương tự.

+2

Điểm sử dụng nguyên mẫu bị mất nếu bạn khai báo phương thức _both_ trên nguyên mẫu và trong hàm như trước, như sau này sẽ ghi đè lên định nghĩa nguyên mẫu – altschuler

+0

Cảm ơn bạn đã nắm bắt; Tôi đã cập nhật câu trả lời của mình để không quá ngớ ngẩn. –

+0

Cảm ơn. Để tạo mẫu để hoạt động, tôi phải sử dụng kỹ thuật từ khóa 'mới' như trong 'Obj mới' hoặc thực hiện công việc này với nhà máy 'newObj' của tôi? – gloo

1

Tất cả chúng sẽ có trường hợp riêng của phương pháp đó.

Nếu bạn sử dụng prototypes, họ sẽ chia sẻ phương thức đó, với điều kiện bạn khai báo phương thức trên đối tượng mẫu.

Vì vậy, bạn có thể làm một cái gì đó giống như

newObj.prototype.add = function(n) { 
    return this.x+n 
} 

Và sau đó không tuyên bố add trên đối tượng như trước đây. Trong động cơ V8 có một thứ gọi là hidden classes, về cơ bản có nghĩa là tất cả các trường hợp newObj sẽ chia sẻ một lớp ẩn miễn là bạn không thực hiện thay đổi đối với một cá thể, mà (theo như tôi hiểu) có hiệu quả làm cho tất cả newObj chia sẻ phương pháp như với prototyping.

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