Web Audio API - 克隆audioBuffer

时间:2017-04-27 11:04:21

标签: javascript clone web-audio web-audio-api audiobuffer

我有一个deepClone函数,我在整个程序中使用它来克隆一个对象的所有属性和值并返回克隆对象(参见下面的代码)。我现在想要在对象中包含audioBuffer并成功将其复制到返回的对象。有没有办法修改功能以包含此功能?

要注意:并非所有传递给deepClone函数的对象都包含audioBuffer,因此它应该能够应对并成功克隆带有和不带对象的对象。

编辑:有人可以想出一种方法将JSON.parse(JSON.stringify(object))与作为答案之一提供的解决方案结合起来吗?即在克隆发生时检查对象的属性,if (property == 'trackBuffer')克隆它与其他克隆不同?

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' s trackBuffer将转换为一个空对象,这是JSON.parse(JSON.stringify(object));所期望的。

修改deepClone以成功克隆audioBuffer但保留现有功能的最佳方法是什么?

非常感谢任何帮助,谢谢!

1 个答案:

答案 0 :(得分:1)

我认为下面的代码对于克隆对象很有用。

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?