所以,我设置了
let recognition = new SpeechRecognition;
recognition.continuous = true;
recognition.interimResults = false;
recognition.lang = 'en-US';
this.setState({
recognition
});
console.log(this.state.recognition)
给了我语音识别对象。
因为我不应该使用this.state.recognition.lang = 'ja-JP'
直接改变状态,所以我尝试创建一个新对象来将识别状态设置为:
let newObject = {...this.state.recognition, lang: 'ja-JP'}
但是,console.log(newObject)
返回{ lang: 'ja-JP' }
,其余属性未克隆。
这是webkitspeechrecognition api的问题,是否有变通方法才能使其正常工作?
答案 0 :(得分:0)
对象散布运算符(...
)返回Object
的可枚举属性作为键值对。但是,并非所有从Object
原型继承的类型都具有可枚举的属性,并且看起来本机SpeechRecognition
类型就是其中之一-没有可迭代的键,而只有不可枚举的属性。 (因此,...(new SpeechRecognition)
甚至不会引发错误;它忠实地返回了recognition
的零可枚举属性。这实际上不足为奇,因为有很多内置的Javascript对象类型没有可枚举的属性。)
我认为您将需要使用所需的new SpeechRecognition
创建一个recognition.lang = 'ja-JP'
实例,然后为此创建一个setState
。据我所知,没有一种传播或.assign()
方法可以从旧实例创建新的SpeechRecognition
实例。我可以看到这如何造成浏览器向其分配内存的多个SpeechRecognition
实例的情况。您可能需要发挥创造力,并在delete
完成后SpeechRecognition
对旧setState
实例的引用,以便垃圾回收可以完成其工作,而只剩下一个实例。 / p>