使用 web-worker 冻结对象

Freeze objects using web-worker

我有一组集合需要 freezed 使用 web-worker。下面的示例显示了单个集合冻结。

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
    });
}

对象的可枚举性、可配置性或可写性属性是否仅限于特定范围?

当您调用 postMessage(obj) 时,您不会发送 obj - 它是使用 structured clone algorithm.

克隆的

MDN 页面对冻结对象发生的情况相当明确:

Property descriptors, setters, and getters (as well as similar metadata-like features) are not duplicated. For example, if an object is marked read-only using a property descriptor, it will be read-write in the duplicate, since that's the default condition.

因此您不能在 WebWorker 中冻结对象并将其发送回主线程。

顺便说一下 - 您不必对传递给 WebWorker 的消息调用 JSON.stringify