我有一组使用web-worker需要freezed的集合。以下示例显示单一收集冻结。
var worker = new Worker("worker.js");
worker.onmessage = function (e) { // WATCH MESSAGES FROM THE WORKER
var data = e.data;
// TEST: freezed collection property changes here in main scope. Weird!!!
};
worker.postMessage(JSON.stringify({
'collection' : someHugeJSON_object
}));
// In my worker.js
function deepFreeze(){
// my freezing logic
}
onmessage = function (e) {
var data = JSON.parse(e.data);
freezedJSON_object = deepFreeze(data.collection);
// TEST: collection property does not change in worker scope after freezing
// DONE FREEZING EVERYTHING... PHEW!!!
postMessage({
'collection' : freezedJSON_object
});
}
对象的可枚举性,可配置性或可写性属性是否仅限于特定范围?
答案 0 :(得分:3)
当您致电postMessage(obj)
时,您不会使用structured clone algorithm发送obj
- 克隆。
MDN页面对冻结对象的结果非常明确:
属性描述符,setter和getters(以及类似的类似元数据的功能)不重复。例如,如果使用属性描述符将对象标记为只读,则它将以重复方式进行读写,因为它是默认条件。
因此,您无法在WebWorker中冻结对象并将其发送回主线程。
顺便说一下 - 您不必在传递给WebWorker的邮件上调用JSON.stringify
。