这个问题在某种程度上是为了理解原型get-set。
我有一个场景,需要将SpeechSynthesis支持的语音映射到Google Translation API支持的语言代码。例如,
现在,我可以通过获取语音运行时或存储语音并在 javascript 中的某种方法中对映射进行硬编码来执行相同的操作。如果我采用运行时方法,我需要调用getVoice()并speechSynthesis.onvoiceschanged = () => {}映射号码,这些号码在每个语音更改事件中都会被调用。所以,我想要进行硬编码。
现在,当我将映射数组存储在变量中并通过索引调用它时,我得到了 SpeechSynthesisVoice 对象,就像我们在getVoices()[index].
此外,如果我将此对象值设置为speechSynthesis.voice,则会收到错误:
Uncaught TypeError: Failed to set the 'voice' property on 'SpeechSynthesisUtterance': The provided value is not of type 'SpeechSynthesisVoice'.
Run Code Online (Sandbox Code Playgroud)
这是由于手动存储的对象值的原型不匹配造成的。
例如,
1.SpeechSynthesisVoice对象:
2. 手动存储SpeechSynthesisVoice对象的值:
为了解决这个问题,我使用 获取了 SpeechSynthesisVoice 对象的原型getVoice(),然后将其设置为一个变量,并进一步将此变量设置为我的手动映射对象。喜欢,
得到:
voicePrototype = getVoices()[9].__proto__;
Run Code Online (Sandbox Code Playgroud)
放:
voices[index].SpeechSynthesisVoice.__proto__ = voicePrototype;
Run Code Online (Sandbox Code Playgroud)
并且,它已设置,如下面的屏幕截图所示:
我也尝试过Object.setPrototypeOf()并得到了相同的结果。
现在,当我再次想要将此对象设置为 时speechSynthesis.voice,尽管我的原型匹配,但我仍然遇到相同的错误。
任何人都可以请建议,是否可以同样设置对象原型并使用它?提前致谢。