我知道再次阅读这个主题确实很烦人。在开始深入研究代码之前,一种解决方案可能是我没有在 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/