JavaScript 克隆一个“类”实例

JavaScript cloning a "class" instance

本文关键字:一个 实例 JavaScript      更新时间:2023-09-26

我有一个这样的类:

function Element(){
    this.changes = {};
}

现在我有一个像这样的"类"实例,el = new Element().这些实例存储在数组中,如 elements.push(el) .

这个元素数组现在存储在一个对象中,然后将其推送到一个数组中,states .

现在在某些情况下,我需要其中一个元素的副本,所以我需要做一些类似的事情,var cloned = $.extend(true, {}, states[0]) .在这里,我假设我们正在克隆第一个状态。

现在的问题是,我得到的,state[1].elements[0]仍然指向原始实例。因此,我对克隆对象所做的任何更改也会更改原始对象。

被困在这样一个微不足道的问题上是令人沮丧的......

这是我为测试它而创建的小提琴:http://jsfiddle.net/E6wLW/

$.extend只是克隆普通对象。如果对象具有构造函数,则不会克隆它,而只是复制。

来自$.extend来源:

if ( jQuery.isPlainObject(copy) /* ... */) {
  // do the recursive $.extend call and clone the object                
} else if ( copy !== undefined ) {
  target[ name ] = copy;
  // ^^^^^ just copy
}

因此,$.extend()将调用返回 false 的isPlainObject(el),因为它el有一个构造函数,而不是克隆el被复制。所以states[1].elements[0]states[0].elements[0]是同一个对象,因为它不是克隆的。

如果我们从以下位置修改您的示例:

function Element(){
  this.changes = {};
}
var el = new Element();    // $.isPlainObject(el); <- false
// ...

到:

var el = { changes: {} };  // $.isPlainObject(el); <- true
// ...

它将正确克隆el在这里看到它。

您可以使用

http://documentcloud.github.com/underscore/#clone 来克隆对象,例如:

var cloned = _.clone(states[0]);