gpt4 book ai didi

javascript - 如何克隆 JavaScript 类实例?

转载 作者:可可西里 更新时间:2023-11-01 01:32:00 24 4
gpt4 key购买 nike

如何克隆 JavaScript 类实例?

我尝试了普通的 jQuery 扩展,但它只返回一个 vanilla 对象。我查看了堆栈上的许多其他答案,但找不到如何克隆实例。

function Parent(name) {
this.name = name;
}

Parent.prototype.sayHello = function() {
console.log('Hello my name is ' + this.name);
}

function Child(name) {
Parent.call(this, name);
}

Child.prototype = Object.create(Parent.prototype);

var child = new Child('Billy');

var clone = $.extend(true, {}, child);
clone.name = 'Bob';

child.sayHello();
clone.sayHello();

console.log(child instanceof Child);
console.log(clone instanceof Child);

http://jsfiddle.net/39gjA/

我希望克隆是深度/递归的。 IE。所有作为对象的属性也被克隆。

最佳答案

How do I clone a JavaScript class instance?

如果实例是在构造函数中大量使用闭包创建的,那几乎是不可能的。我们现在可能永远不会设置哪些内部值,以及如何重现这样的设置。因此,最简单的方法是,如果每个类都提供一个 clone 函数它知道该怎么做。

normal jQuery extend just returns a vanilla object

不一定,它返回你传入的内容。使用

var clone = $.extend(true, Object.create(Object.getPrototypeOf(child)), child);

相反,您的 instanceof 用法将正常工作。请注意,true 表示“深层”副本,它可能是也可能不是您想要的。此外,$.extend 也将愉快地复制可枚举的继承属性,因此您可能需要使用更复杂的 extend 函数。

或者根本不用 jQuery,只复制自己的可枚举属性,并且只使用浅拷贝:

var clone = Object.assign(Object.create(Object.getPrototypeOf(child)), child);

但同样,并非所有对象都可以通过这种方式进行克隆,请参见我上面的第一点。

关于javascript - 如何克隆 JavaScript 类实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16024940/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com