それはあなたがクローンしたいものに本当に依存します。これは本当にJSONオブジェクトですか、それともJavaScriptの任意のオブジェクトですか?クローンを作成する場合、問題が発生する可能性があります。どのトラブル?以下で説明しますが、最初に、オブジェクトリテラル、プリミティブ、配列、DOMノードを複製するコード例を示します。
function clone(item) {
if (!item) { return item; } // null, undefined values check
var types = [ Number, String, Boolean ],
result;
// normalizing primitives if someone did new String('aaa'), or new Number('444');
types.forEach(function(type) {
if (item instanceof type) {
result = type( item );
}
});
if (typeof result == "undefined") {
if (Object.prototype.toString.call( item ) === "[object Array]") {
result = [];
item.forEach(function(child, index, array) {
result[index] = clone( child );
});
} else if (typeof item == "object") {
// testing that this is DOM
if (item.nodeType && typeof item.cloneNode == "function") {
result = item.cloneNode( true );
} else if (!item.prototype) { // check that this is a literal
if (item instanceof Date) {
result = new Date(item);
} else {
// it is an object literal
result = {};
for (var i in item) {
result[i] = clone( item[i] );
}
}
} else {
// depending what you would like here,
// just keep the reference, or create new object
if (false && item.constructor) {
// would not advice to do that, reason? Read below
result = new item.constructor();
} else {
result = item;
}
}
} else {
result = item;
}
}
return result;
}
var copy = clone({
one : {
'one-one' : new String("hello"),
'one-two' : [
"one", "two", true, "four"
]
},
two : document.createElement("div"),
three : [
{
name : "three-one",
number : new Number("100"),
obj : new function() {
this.name = "Object test";
}
}
]
})
次に、REALオブジェクトの複製を開始するときに発生する可能性がある問題について説明します。私は今、あなたが次のようなことをして作成したオブジェクトについて話している
var User = function(){}
var newuser = new User();
もちろん、それらを複製できます。問題ありません。すべてのオブジェクトがコンストラクタープロパティを公開し、それを使用してオブジェクトを複製できますが、常に機能するとは限りません。for inこのオブジェクトに対して単純なこともできますが、同じ方向に進みます-トラブル。コードにはクローン機能も含まれていますが、if( false )ステートメントによって除外されています。
では、なぜクローニングが面倒なのでしょうか?さて、まず第一に、すべてのオブジェクト/インスタンスにはいくつかの状態があるかもしれません。たとえば、オブジェクトにプライベート変数がないことを確認することはできません。その場合は、オブジェクトのクローンを作成することで、状態を破壊するだけです。
状態がないと想像してください、それは結構です。その後、まだ別の問題があります。「コンストラクタ」メソッドによるクローン作成には、別の障害があります。これは引数の依存関係です。このオブジェクトを作成した人が作成しなかった、ある種のことを確認することはできません
new User({
bike : someBikeInstance
});
これが事実である場合、あなたは運が悪いです、someBikeInstanceはおそらくいくつかのコンテキストで作成されており、そのコンテキストはクローンメソッドでは不明です。
じゃあ何をすればいいの?あなたはまだfor in解決を行うことができ、そのようなオブジェクトを通常のオブジェクトリテラルのように扱いますが、おそらくそのようなオブジェクトをまったく複製せずに、このオブジェクトの参照を渡すだけのアイデアですか?
別の解決策は、複製する必要があるすべてのオブジェクトがこの部分を自分で実装し、適切なAPIメソッド(cloneObjectなど)を提供するという規則を設定することです。cloneNodeDOMに対して何が行われているのか。
あなたが決める。