我在整个程序中使用了一个deepClone函数,它克隆一个对象的所有属性和值并返回克隆的对象(参见下面的代码)。现在,我希望在对象中包含一个audioBuffer,并成功地将其复制到返回的对象。是否有一种方法可以修改函数以包含此功能?
需要注意的是:并非所有传递给deepClone audioBuffer**,函数的对象都将包含audioBuffer**,,因此它应该能够处理并成功地克隆带有和不包含它们的对象。
JSON.parse(JSON.stringify(object))编辑:有人能想出一种将和解决方案结合起来的方法吗?也就是说,在克隆发生时检查对象的属性, 克隆对象与其他对象不同?。
deepClone函数:
function deepClone (object) {
return JSON.parse(JSON.stringify(object));
};
/**
* Utility function for deep object cloning
*
* @param {object} obj Object to be cloned
* @returns {object} The deep-cloned object
*/
function deepClone (object) {
return JSON.parse(JSON.stringify(object));
};
// Create audio context
var context = new AudioContext();
// Create empty audio buffer
var audioBuffer = context.createBuffer(2, 22050, 44100);
// Create object to be cloned
var track = {
prop1: "val1",
prop2: "val2",
trackBuffer: audioBuffer
};
// Log before clone
console.log("before clone, track: \n", track);
// Clone track
var clonedTrack = deepClone(track);
// Log after clone
console.log("after clone, clonedTrack: \n", clonedTrack);
正如您从代码片段中看到的,clonedTrack的trackBuffer被转换为一个空对象,这是JSON.parse(JSON.stringify(object));所期望的。
修改deepClone以成功克隆audioBuffer但保留现有功能的最佳方法是什么?
任何帮助都将不胜感激,谢谢!
发布于 2022-05-10 00:40:23
我的建议是,将AudioBuffer (反序列化)作为特例处理更安全。当您的代码必须跨多个浏览器工作并且具有未来的安全性时,最好使用对象的受支持的API。
function cloneAudioBuffer(fromAudioBuffer) {
const audioBuffer = new AudioBuffer({
length:fromAudioBuffer.length,
numberOfChannels:fromAudioBuffer.numberOfChannels,
sampleRate:fromAudioBuffer.sampleRate
});
for(let channelI = 0; channelI < audioBuffer.numberOfChannels; ++channelI) {
const samples = fromAudioBuffer.getChannelData(channelI);
audioBuffer.copyToChannel(samples, channelI);
}
return audioBuffer;
}发布于 2017-04-27 11:09:40
我认为下面的代码对于克隆对象是有用的。
function clone(obj) {
if (null == obj || "object" != typeof obj) return obj;
var copy = obj.constructor();
for (var attr in obj) {
if (obj.hasOwnProperty(attr)) copy[attr] = obj[attr];
}
return copy;
}请注意,下面的链接给出了有说明的答案。How do I correctly clone a JavaScript object?
https://stackoverflow.com/questions/43655953
复制相似问题