JavaScript cloning a "class" instance

This question already has an answer here:

  • How do I correctly clone a JavaScript object? 54 answers

  • $.extend is only cloning plain objects. If the object has a constructor then it is not cloned, but just copied.

    From the $.extend source:

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

    So $.extend() will call isPlainObject(el) which will return false, because el has an constructor and instead of cloning the el is copied. So states[1].elements[0] is the same object as states[0].elements[0] because it was not cloned.

    If we modify your example from:

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

    into:

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

    It will clone the el properly. See it HERE .


    您可以使用http://documentcloud.github.com/underscore/#clone克隆对象,如:

    var cloned = _.clone(states[0]);
    
    链接地址: http://www.djcxy.com/p/24766.html

    上一篇: JavaScript如何从复制的对象中删除键?

    下一篇: JavaScript克隆一个“类”实例