gpt4 book ai didi

javascript - 如何克隆包含 getter 和 setter 的 JavaScript 对象?

转载 作者:搜寻专家 更新时间:2023-11-01 04:45:11 25 4
gpt4 key购买 nike

在我正在进行的项目中,我需要将一个对象克隆到一个变量。

我首先尝试 - 这似乎是最明显的解决方案 - 执行 var obj2 = obj1,但我很快意识到这使得 obj2 referobj1,所以每当我在 obj2 中设置一个属性时,该属性也会在 obj1 中更新。好吧,我不能接受。

因此,我开始四处寻找在 JavaScript 中克隆对象的方法 - 我为此找到了多种解决方案,主要是 var obj2 = JSON.parse(JSON.stringify(obj1)) - 但是没有保留我为我的对象定义的所有 getter 和 setter!

现在对我来说最明显的解决方案似乎是首先使用上面的 JSON 技巧使 obj2 具有所有 obj1 的属性,然后遍历所有对象getter 和 setter 并使用 Object.defineProperty() 将它们添加回去,但我还没有找到一种方法来获取对象的所有 getter/setter。

最佳答案

在实际层面上,不可能 100% 准确地克隆一个对象,因为 getter 和 setter(实际上还有其他函数)可能会通过闭包访问词法范围内的私有(private)变量。访问这样的方法将引用原始对象,而不是克隆对象。

如果(且仅当)不是这种情况,您可以枚举通过 Object.getOwnPropertyNames() 找到的所有属性(甚至是不可枚举的属性),然后为每个名称简单地获取带有 Object.getOwnPropertyDescriptor 的单个 PropertyDescriptors,然后将结果字段传递给 Object.defineProperty,例如:

function shallowClone(obj) {
var clone = Object.create(Object.getPrototypeOf(obj));

var props = Object.getOwnPropertyNames(obj);
props.forEach(function(key) {
var desc = Object.getOwnPropertyDescriptor(obj, key);
Object.defineProperty(clone, key, desc);
});

return clone;
}

在 ES2017 中你可以 do this instead :

function shallowClone(obj) {
return Object.create(
Object.getPrototypeOf(obj),
Object.getOwnPropertyDescriptors(obj)
);
}

关于javascript - 如何克隆包含 getter 和 setter 的 JavaScript 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34480936/

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