关于javascript:如何克隆JS对象?

How to clone js object?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
What is the most efficient way to clone a JavaScript object?

如何使用如下的外部引用克隆JS对象:

1
2
3
4
{ ID: _docEl,
  Index: next,
  DocName: _el
}

有什么想法吗?


您必须对该对象进行迭代,并复制其所有属性。

然后,如果它的任何属性也是对象,假设您也要克隆这些属性,那么您必须递归到它们中。

这里有各种方法可以做到这一点:克隆javascript对象最有效的方法是什么?


根据托马斯鲁特的建议(未经测试的代码),我可以这样做:

1
2
3
4
5
6
7
8
9
10
11
12
13
function cloneObj(obj) {
    var clone = {};

    for (var i in obj) {
        if (obj[i] && typeof obj[i] == 'object') {
            clone[i] = cloneObj(obj[i]);
        } else {
            clone[i] = obj[i];
        }
    }

    return clone;
}


您可以使用jquery.extend:

1
2
3
4
5
// Shallow copy
var newObject = jQuery.extend({}, oldObject);

// Deep copy
var newObject = jQuery.extend(true, {}, oldObject);

以下文章非常有用:

在javascript中深度克隆对象最有效的方法是什么?


javascript JS对象克隆

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Object._clone = function(obj) {
  var clone, property, value;
  if (!obj || typeof obj !== 'object') {
    return obj;
  }
  clone = typeof obj.pop === 'function' ? [] : {};
  clone.__proto__ = obj.__proto__;
  for (property in obj) {
    if (obj.hasOwnProperty(property)) {
      value = obj.property;
      if (value && typeof value === 'object') {
        clone[property] = Object._clone(value);
      } else {
        clone[property] = obj[property];
      }
    }
  }
  return clone;
};

CoffeeDescript JS对象克隆

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# Object clone
Object._clone = (obj) ->
  return obj if not obj or typeof(obj) isnt 'object'
  clone = if typeof(obj.pop) is 'function' then [] else {}

  # deprecated, but need for instanceof method
  clone.__proto__ = obj.__proto__

  for property of obj
    if obj.hasOwnProperty property
      # clone properties
      value = obj.property
      if value and typeof(value) is 'object'
        clone[property] = Object._clone(value)
      else
        clone[property] = obj[property]

  clone

现在你可以试着这么做了

1
2
3
A = new TestKlass
B = Object._clone(A)
B instanceof TestKlass => true

1
2
3
function objToClone(obj){
  return (new Function("return" + obj))
}