是否可以使用Object.assign来克隆带有其方法的对象

Is it possible to use Object.assign to clone an object with its methods?

本文关键字:方法 对象 可以使 Object assign 是否      更新时间:2023-09-26

我想使用Object.assign来克隆一个类的实例,包括它附带的任何方法。是否可以只使用Object.assign,或者我应该使用类似lodash deepClone的东西?

class Foo {
  constructor() {
    this.a = 1; 
    this.b = 2;
  }
  add() {
    return this.a + this.b;
  }
}

const foo1 = new Foo();
console.log(foo1.add());
console.log(foo1.b);

// ? Where did the add go?
const foo2 = Object.assign({}, foo1, { b: 99 });
console.log(foo2.add());
console.log(foo2.b);

示例-http://jsbin.com/dacopazanu/edit?js,控制台

Object.assign只复制自己的可枚举属性,而继承的class方法不是。

但你无论如何都不想复制这些——要克隆一个实例,你需要创建一个继承自同一原型的对象:

const foo2 = Object.assign(Object.create(Object.getPrototypeOf(foo1)), foo1);

答案似乎是,开箱即用,不,这是不可能的。

使用像lodash这样有用的实用程序库,尤其是它的cloneDeep方法,似乎是一条可靠的道路。