2

我有一个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'trackBuffer被转换为预期来自JSON.parse(JSON.stringify(object));.

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

任何帮助将不胜感激,谢谢!

4

1 回答 1

0

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

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;
}

请注意,下面的链接给出了带有描述的答案。 如何正确克隆 JavaScript 对象?

于 2017-04-27T11:09:40.997 回答