Javascript 为什么只有WebAssembly.Memory.buffer的getter?什么';如果缓冲区是SharedArrayBuffer,那么底层机制是什么?

Javascript 为什么只有WebAssembly.Memory.buffer的getter?什么';如果缓冲区是SharedArrayBuffer,那么底层机制是什么?,javascript,webassembly,sharedarraybuffer,Javascript,Webassembly,Sharedarraybuffer,因为我们可以通过WebAssembly.memory将WebAssembly内存设置为共享内存: wasmMemory = new WebAssembly.Memory({ "initial": NUMBER, "maximum": NUMBER, "shared": true }); WebAssembly.Memory.buffer只有一个getter,因此我无法执行以下操作: buff = new Sh

因为我们可以通过
WebAssembly.memory
将WebAssembly内存设置为共享内存:

wasmMemory = new WebAssembly.Memory({
    "initial": NUMBER,
    "maximum": NUMBER,
    "shared": true
});
WebAssembly.Memory.buffer
只有一个getter,因此我无法执行以下操作:

buff =  new SharedArrayBuffer(NUMBER);
wasmMemory.buffer = buff;
第一个问题

它设计成这样有什么原因吗。我查过了答案,但没有找到答案

可能是normal
SharedArrayBuffer
和wasm的
SharedArrayBuffer
的底层实现,尽管它们的
实例是相同的

或者在这个设计中还有其他的结果吗

第二个问题

有没有什么神奇的方法可以将已有的
SharedArrayBuffer
放入
WebAssembly.Memory


我之所以想这样做,是因为我有一个新类,它是从原来的
SharedArrayBuffer
扩展而来的,我也想在wasm中使用它。

我也找不到任何官方解释,但是如果我不得不猜测,这是因为每次内存增长时,您的自定义缓冲区都会自动替换为默认缓冲区。

我也找不到任何官方解释,但如果我不得不猜测,这是因为每次内存增长时,您的自定义缓冲区都会自动替换为默认缓冲区。

我查阅了V8的实现。WASM的底层缓冲区似乎与JS的相同。
WASM objects.cc
handlebuffer=(shared==SharedFlag::kShared)?隔离->工厂()->NewJSSharedArrayBuffer(std::move(backing_store)):隔离->工厂()->NewJSArrayBuffer(std::move(backing_store))顺便说一句。我认为你的猜测听起来很合理。我还看到最近的一则公告,由于解决了幽灵攻击,他们带回了SharedArrayBuffers,并说WebAssembly buffer现在将是SharedArrayBuffer。这是正确的答案,应该被接受。缓冲区由WebAssembly.Memory实现管理,在增长时可以交换,这就是为什么您不能提供自己的缓冲区。我查阅了V8的实现。WASM的底层缓冲区似乎与JS的相同。
WASM objects.cc
handlebuffer=(shared==SharedFlag::kShared)?隔离->工厂()->NewJSSharedArrayBuffer(std::move(backing_store)):隔离->工厂()->NewJSArrayBuffer(std::move(backing_store))顺便说一句。我认为你的猜测听起来很合理。我还看到最近的一则公告,由于解决了幽灵攻击,他们带回了SharedArrayBuffers,并说WebAssembly buffer现在将是SharedArrayBuffer。这是正确的答案,应该被接受。缓冲区由WebAssembly.Memory实现管理,可以在增长时交换,这就是为什么您不能提供自己的缓冲区。