看了一些帖子,但最后都觉得不对,靠点谱的如下function clone(obj){
  if(!obj || typeof obj!='object'){
    return obj;
  }
  function Clone(){}
  Clone.prototype = obj;
  var o = new Clone();
  for(var key in obj){
    if(typeof obj[key] == 'object'){
      o[key]=clone(obj[key]);
    }
  }  return o;
}但段代码有两个问题:
1、原始obj修改,被复制的新obj也会变动,毕竟是prototype引用
2、新的obj的_prototype_指向才是obj的复制,不算100%还原希望有明白的人能给些指点,谢谢!

解决方案 »

  1.   

    你完全clone的对象是一个实例么?
      

  2.   

    下面的可以么,不过类的conctructor一定要指向正确function Person(){
    this.name = "csdn";
    this.age = "10";
    }

    Person.prototype.conctructor = function(){
    return Person;
    }

    Person.prototype.setName = function(name){
    this.name = name;
    }

    Person.prototype.sayName = function(){
    alert(this.name)
    }

    Person.prototype.sayAge = function(){
    alert(this.age)
    }

    var p = new Person();
        
        p.setName("123");

    function clone(obj){
    var _obj = new obj.constructor;
    for (var x in obj){
    if(obj.hasOwnProperty(x)) {
    _obj[x] = obj[x];
    }
    return _obj;
    }
    }

    var cloneObj = clone(p);

    cloneObj.sayName();
      

  3.   


    Object.prototype.clone = function(){
      var me = {};
      for(var k in this){
        me[k] = this[k].clone?this[k].clone():this[k]  ;
      }
      return me;
    }
    差不多这样吧
      

  4.   

    补充下 你自己建立的对象 在需要的情况下 必须重写CLONE方法这个是面向对象语言的通常做法
      

  5.   

    获取js source code,
    replace替换变量名,
    eval。
      

  6.   


    不知道如何完整获取source code,如果您指的是toString()的话,则无法复制原型链
      

  7.   

    讲方法加到object的原型上,那所有的变量和方法就都有了clone方法,这样无限递归下去我没明白您的本意,但运行结果是,堆栈溢出
      

  8.   

    感谢您的回复,但还是不能让我满意:
    1、 _obj[x] = obj[x]; 引用变量仍会引用,没有克隆
    2、你的这个clone 普遍性不太好