3

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

// 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 时不会克隆自定义属性。

我在这里做错了吗?提前致谢 ;))

4

1 回答 1

2

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

  1. 将 serialized.[[SnapshotState]] 设置为值的快照状态。

  2. 将 serialized.[[ByteSequence]] 设置为值的底层字节序列。

  3. 将 serialized.[[Name]] 设置为 value 的 name 属性的值。

  4. 将 serialized.[[LastModified]] 设置为 value 的 lastModified 属性的值。

于 2021-05-30T23:26:30.493 回答