javascript - 克隆 JavaScript 对象。又是:(

标签 javascript jquery clone extend

我知道再次阅读这个主题确实很烦人。在开始深入研究代码之前,一种解决方案可能是我没有在 JavaScript 中获取原型(prototype)和对象。但在这一点上,我想,我愿意。

问题是:
如何克隆一个 JavaScript 类(使用原型(prototype)创建),以便“克隆”的类在之后扩展和执行时保持不变?

function clone(obj){
  if(obj == null || typeof(obj) != 'object')
      return obj;

  var temp = new obj.constructor();
  for(var key in obj)
      temp[key] = clone(obj[key]);

  return temp;
}

var FOO = function() {
  var myBAR = clone(BAR);
  myBAR.prototype = jQuery.extend(true, myBAR.prototype, this); // deep cloning twice and extending with this
  console.log("FOO:", this.name);
  new myBAR();
};

FOO.prototype = {
  name: "FOO"
};

var BAR = function() {
  console.log("BAR:", this.name);
};

BAR.prototype = {
  name: "BAR"
};

new FOO(); // returns FOO: FOO and BAR: FOO 
new BAR(); // returns BAR: FOO should return BAR: BAR

如果我没猜错的话,第二次调用 new BAR() (在 new FOO() 之后)应该返回 BAR: BAR code> 不是目前的 BAR: FOO

此问题的一个可能的解决方案是完全重写 clone 函数,如下所示:

function clone(obj) {
  return eval("("+obj.toString()+")"); // the same as eval(uneval(obj));
}

但是这种方法有一个很大的缺点,您无法传递任何动态创建的对象。

有什么想法吗?

最佳答案

问题在于你如何克隆“原型(prototype)”

下面一行

myBAR.prototype = jQuery.extend(true, myBAR.prototype, this); // deep cloning 

您不仅克隆“原型(prototype)”,还克隆“名称”属性。

如果将上面的行替换为

myBAR.prototype = jQuery.extend(true, myBAR.prototype, this.prototype); // deep cloning 

您的代码现在将返回

new FOO(); // returns FOO:FOO and BAR:BAR
new BAR(); // returns BAR:BAR

关于javascript - 克隆 JavaScript 对象。又是:(,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1168792/

相关文章:

delphi - 我可以使用分配来复制对象的对象吗?

javascript - 使用 ES6 箭头函数过滤 'objects with nested objects' 数组

javascript - 从文本字段获取值以另存为 PDF

jquery - 仅在最后一个类上运行函数

radio 输入组的 jQuery 验证器未在 Bootstrap 中验证

javascript - jQuery 如何修改内存中克隆元素的 html

javascript - JQuery 转义撇号和双撇号?

javascript - 如何使用 JS/JQuery 检测视频是否全屏?

javascript - 如何在 html/javascript 中将带有某些类的 div 添加到另一个 div(彼此内部)

java - 创建对象的独立副本