文件实例上的自定义 属性 在传递给 Web Worker 时未被克隆

Custom property on File instance not cloned when passing to web worker

根据 MDN,File 对象可以传递给 Web Worker,并且可以使用结构化克隆算法正确克隆它们。到目前为止,一切都很好。这适用于我测试过的所有浏览器:

// myFile comes from a form.
// webWorker is the WebWorker object.
webWorker(myFile);  // myFile appears as-is on the other side,
                    // only losing non-enumerable properties
                    // and functions, per the spec.

但这行不通:

// myFile comes from a form.
// webWorker is the WebWorker object.
myFile.customIdProperty = 'some string value';
webWorker(myFile);  // myFile appears on the other side,
                    // WITHOUT the 'customIdProperty' property.

奇怪的是,这个有效:

// myFile is a custom object now.
// webWorker is the WebWorker object.
myFile = {};
myFile.customIdProperty = 'some string value';
webWorker(myFile);  // myFile appears on the other side,
                    // WITH the 'customIdProperty' property.

这发生在 Chrome、Firefox 等的最新版本中,因此我认为这不是浏览器问题。

选项:

  1. 我做错了什么,导致 属性 在克隆对象时丢失。
  2. 当克隆预定义对象(如文件)而不是我创建的对象时,我添加的所有自定义属性都会丢失,因为浏览器会忽略非标准对象属性。
  3. 我不理解规范,显然在将对象传递给 Web Worker 时不会克隆自定义属性。

我是不是做错了什么? 提前致谢 ;))

File 接口有自己的 serialization steps,这不是 Javascript 对象的接口。所以是的,您的自定义属性丢失了,因为这些步骤不包括获取自己的属性。

  1. Set serialized.[[SnapshotState]] to value’s snapshot state.

  2. Set serialized.[[ByteSequence]] to value’s underlying byte sequence.

  3. Set serialized.[[Name]] to the value of value’s name attribute.

  4. Set serialized.[[LastModified]] to the value of value’s lastModified attribute.