Supongamos que tengo una clase de javascript:
class SomeClass { constructor() { this.field1 = []; this.field2 = 0; this.field3 = "somestring"; } someMethod(param1) { // do some magical stuff } } En algún momento tengo la necesidad de fusionar dos objetos, uno de ellos es del tipo SomeClass .
const obj1 = new SomeClass(); const obj2 = { field1: [1, 2, 3], field2: [3, 4, 5], field3: "other string" } const mergedObj = {...obj1, ...obj2}; Ahora he perdido el método someMethod en la variable mergedObj , lanzando un TypeError:
mergedObj.someMethod("amazingparam"); //=> Uncaught TypeError: mergedObj.someMethod is not a function¿Cómo puedo mantener las definiciones de los métodos?
Editar
Para ser más claro: me gustaría crear un nuevo objeto, mantener el obj1 y el obj2 como estaban.
Puede usar Object.assign , lo fusionará por usted, pero esto mutará su primer object , por lo que para resolver ese problema, podría crear un clon de su primer objeto sobre la marcha usando Object.create como este
class SomeClass { constructor() { this.field1 = []; this.field2 = 0; this.field3 = "somestring"; } someMethod(param1) { console.log('hello') // do some magical stuff } } const obj1 = new SomeClass(); const obj2 = { field1: [1, 2, 3], field2: [3, 4, 5], field3: "other string" } let mergedObj = Object.assign(Object.create(obj1), obj2); mergedObj.someMethod('')A partir de la respuesta de Joseph, encontré una solución.
class SomeAmazingClass{ constructor() { this.var1 = ""; this.var2 = ""; } someMethod() { return this.var1 + this.var2; } } function mergeToSomeAmazingClass(obj1, obj2) { return Object.assign(new SomeAmazingClass(), obj1, obj2); } let a1 = new SomeAmazingClass(); a1.var1 = "OldVar1" a1.var2 = "OldVar2" a1.newVar3 = "Yay" let a2 = { var1: "NewVar1" } let merged = mergeToSomeAmazingClass(a1, a2); console.log(merged.someMethod());Esto mantiene las definiciones de los métodos y evita que los objetos de entrada muten. Parece un poco torpe, pero si hay una solución mejor, me encantaría verla.
Editar
Se actualizó la función de combinación.
Simplemente haga que su constructor acepte parámetros opcionales:
class SomeClass { constructor({field1 = [], field2 = 0, field3 = "somestring"}) { Object.assign(this, {field1, field2, field3}); } someMethod(param1) { // do some magical stuff console.log('SomeClass instance here'); } } const obj2 = { field1: [1, 2, 3], field2: [3, 4, 5], field3: "other string" } const obj1 = new SomeClass(obj2); obj1.someMethod(); console.log(obj1);