ES6中如何复制对象方法

3
我想使用扩展运算符克隆一个对象。然而,方法不会被复制,如下所示。
我知道可以使用Object.Assign()来实现,但我正在寻找一种使用ES6语法来实现的方法。 Deep copy in ES6 using the spread syntax 中提供了关于深层复制的解决方案:我只对复制方法和属性感兴趣。 How to clone a javascript ES6 class instance 中使用了Object.Assign()函数。

class Test {
  toString() {
    return "This is a test object";
  }
}

let test = new Test();
let test2 = { ...test };

console.log(String(test));
console.log(String(test2));

// Output: This is a test object
// Output: [object Object]

使用Object.create代替扩展符号。 String(Object.create(test)) 可以像你所想的那样工作。 - rlemon
我想指出的是Object.assign是ES6的一部分。 因此,它可能是您要寻找的东西... - Akxe
ES6 中没有内置的函数来实现这个功能,你应该使用 lodash 中的 cloneDeep() 方法。 - Ahmet Zeybek
2个回答

2

这个:

class Test {
  toString() {
    return "This is a test object";
  }
} 

严格来说,它并没有定义任何对象方法。它更多地定义了类方法。
为了让它们被复制,请直接将方法作为“自有属性”附加到对象上:

class Test {
  constructor() {
    // define toString as a method attached directly to
    // the object
    this.toString = function() {
      return "This is a test object";
    }
  }
}

let test = new Test();
let test2 = { ...test };

console.log(String(test));
console.log(String(test2));


1
我认为你可以这样做:

class Test {
  toString() {
    return "This is a test object";
  }
}

let test = new Test();
let test2 = {};

test2.__proto__ = test.__proto__;

console.log(String(test));
console.log(String(test2));

但我不知道,也许这是一种不好的实践:/..

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接