有没有办法克隆javascript对象?不是DOM元素,而是具有特定构造函数的对象。例如,假设我有一个电话号码对象:
function PhoneNumber(number, type) {
this.number = number;
this.type = type;
}
var phoneObj1 = new PhoneNumber('1111111111', 'Home');
var phoneObj2 = //Copy of phoneObj1, but unique so I can set other parameters if necessary.
jQuery使用extend解决了这个问题。
var phoneObj2 = $.extend({}, phoneObj1);
但它返回一个通用对象:
Object{number:'1111111111' type:'Home'}
而不是使用电话号码构造函数名称。我需要一种传递原始phoneObj1的构造函数而不在扩展中实际编写新的PhoneNumber()的方法,因为正在使用的代码被许多不同类型的对象使用,所以在任何给定的时间我都不知道确切的应该使用的构造函数,除了我有一个要引用的对象的事实。
var phoneObj2 = $.extend(new PhoneNumber(), phoneObj1); //I CANNOT do this!
//Maybe something like this?
var phoneObj2 = $.extend(new phoneObj1.constructor.name, phoneObj1); //This throws an error.
答案 0 :(得分:1)
你可以在每个不同类型的对象上有一个方法(可能称为copy()
),它返回该类型对象的构造函数或者只是复制它自己(调用正确的构造函数,因为它知道它是什么样的物体)。因此,您只需在所有对象上调用相同的方法,它就可以为您完成工作。
您可以将此功能放在基类中,并且每个派生类都必须设置构造函数,所有其余代码都是常见的。
答案 1 :(得分:0)
原来那个
var phoneObj2 = $.extend(new phoneObj1.constructor, phoneObj1);
有效吗?我只是在一个不相关的笔记上取消了phoneObj1的构造函数。因此,这可以用作克隆对象的抽象方式,而无需专门编写实际的构造函数。我可以简单地从我正在克隆的对象继承构造函数。
答案 2 :(得分:0)
我只需支持现代版chrome(45)或firefox(34)即可使用新的ecmascript-6 Object.assign()
方法。
Object.assign()
方法用于复制所有值 枚举从一个或多个源对象到目标的自有属性 宾语。它将返回目标对象。
示例强>
var phoneObj2 = Object.assign({}, phoneObj1);
console.log(phoneObj2);
这将获取phoneObj1
中的所有属性,将它们复制到空对象{}
,并将组合对象作为phoneObj2
返回。使用{}
方法后,空phoneObj2
对象和assign
变量指向内存中的同一对象。
有关详细信息,请查看有关MDN的信息:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign
答案 3 :(得分:-1)
查看完整帖子-> https://jscurious.com/how-to-deep-clone-objects-in-javascript/
const obj = { name: 'Amitav', age: 24, address: { city: 'Bangalore', state: 'Karnataka' } }; const makeDeepClone = (obj) => { let newObject = {}; Object.keys(obj).map(key => { if(typeof obj[key] === 'object'){ newObject[key] = makeDeepClone(obj[key]); } else { newObject[key] = obj[key]; } }); return newObject; } const copyObj = makeDeepClone(obj); console.log(copyObj); // {name: "Amitav", age: 24, address: {city: "Bangalore", state: "Karnataka"}} copyObj.address.state = 'Odisha'; console.log(obj.address.state); // "Karnataka" console.log(copyObj.address.state); // "Odisha"