JavaScriptオブジェクトを正しくクローンするには?

あるオブジェクト x があります。これをオブジェクト y としてコピーし、y を変更しても x は変更されないようにしたいと思います。JavaScriptの組み込みオブジェクトから派生したオブジェクトをコピーすると、不要なプロパティが追加されることに気づきました。私がコピーしているのはリテラルで構築された私自身のオブジェクトなので、これは問題ではありません。

JavaScriptオブジェクトを正しくクローンするには?

この記事からHow to copy arrays and objects in Javascript by Brian Huisman:

Object.prototype.clone = function() {
  var newObj = (this instanceof Array) ? [] : {};
  for (var i in this) {
    if (i == 'clone') continue;
    if (this[i] && typeof this[i] == "object") {
      newObj[i] = this[i].clone();
    } else newObj[i] = this[i]
  } return newObj;
};
解説 (6)

ここでは、使用できる関数を紹介します。

function clone(obj) {
    if(obj == null || typeof(obj) != 'object')
        return obj;    
    var temp = new obj.constructor(); 
    for(var key in obj)
        temp[key] = clone(obj[key]);    
    return temp;
}
解説 (4)

オブジェクトに循環的な依存関係がない場合は、他の回答やjQueryのcopyメソッドを使用することをお勧めしますが、いずれも非常に効果的だと思われます。

循環的な依存関係がある場合(つまり、2つのサブオブジェクトが互いにリンクしている場合)は、(理論的な観点から)この問題をエレガントに解決する方法がないため、ちょっと困ったことになります。

解説 (1)