2013-03-12 48 views
5

Tôi có một đối tượng như thế:Đi qua một Javascript Object Web Worker

function A(id) { 
    this.id = id; 
} 

A.prototype.getId = function() { 
    return this.id; 
} 

Nó được bao gồm trong một html-page như một tập tin ("objects.js") cũng như trong lao động web với importScript ("objects.js"). Bây giờ tôi tạo một thể hiện của A trong trang html với "var a = new A()" và đăng nó với "postMessage()" vào một Web Worker.

Điều thú vị là trong nhân viên nó vẫn có thuộc tính "id" với giá trị của nó nhưng hàm nguyên mẫu bị mất. Tôi đoán lý do có thể là các hàm nguyên mẫu được "ràng buộc" với ngữ cảnh trang html chứ không phải ngữ cảnh của nhân viên web.

Vì vậy, những gì tôi đang làm ở người lao động là:

event.data.a.__proto__ = A.prototype; 

Đó là làm việc và tôi thấy nó như một số loại dàn diễn viên ...

Bây giờ câu hỏi của tôi là nếu đó là chỉ và một cách hợp lệ hoặc nếu có một cách tốt hơn để đăng một đối tượng với các hàm nguyên mẫu cho một nhân viên web. Định nghĩa đối tượng có sẵn trong cả hai ngữ cảnh ...

Trả lời

1

Đặc tả dành cho webworkers không cho phép bất cứ điều gì ngoài chuỗi được truyền.

Here là câu hỏi về điều này.

Vì vậy, bạn nên tuần tự hóa dữ liệu đối tượng với (ví dụ) json và sau đó deserialize nó ở phía bên kia, và do đó tạo ra một thể hiện mới của đối tượng, với cùng một dữ liệu, bên trong webworker.

Phương pháp tương tự có thể được sử dụng để chuyển đối tượng ra ngoài một lần nữa - nhưng cả hai đều phải biết cách tạo, tuần tự hóa và deserialize đối tượng thuộc loại A.

+1

Tôi khá chắc chắn rằng nó cũng có thể vượt qua một đối tượng miễn là nó không có chức năng trong đó. Ít nhất nó đang làm việc cho tôi trong tất cả các trình duyệt chính ... – user2160787

+0

@ user2160787 Có, nhưng chỉ vì Javascript sẽ tự động tuần tự hóa và deserialize các đối tượng đơn giản (chẳng hạn như mảng). – fredrik

+0

ok cảm ơn, vì vậy tôi đoán tôi chỉ từ chối các chức năng nguyên mẫu :) – user2160787

1

structure clone algorithm được sử dụng để tuần tự dữ liệu trước khi gửi cho nhân viên web không đi bộ chuỗi nguyên mẫu (để biết chi tiết, xem § 2.7.5 Safe passing of structured data). Điều đó giải thích tại sao các hàm dẫn xuất không được bảo toàn.

Ngoài việc khôi phục đối tượng theo cách thủ công như bạn đã làm, bạn cũng có thể tạo đối tượng mới có chức năng mẫu thử và sử dụng Object.assign để sao chép thuộc tính từ đối tượng đã nhận.

Lưu ý rằng cả hai giải pháp đều cho rằng đối tượng mẫu thử nghiệm và các chức năng của chúng được biết đến với nhân viên web. Nói chung, không có cách tự động để truyền các đối tượng tùy ý trong khi vẫn giữ các chức năng (xem answer của mình để this related question về việc gửi các đối tượng có chức năng).

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