2016-05-02 86 views
0

我想用Object.assign克隆一個類的實例,包括任何方法。是否有可能只與Object.assign或我應該使用類似lodash deepClone的東西?是否有可能使用Object.assign克隆一個對象的方法?

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,console

+2

從[MDN(https://開頭開發商.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/assign),Object.assign()方法只將源對象的枚舉和自己的屬性複製到目標對象。而且我無法發現'add()'是一個枚舉或屬性。你爲什麼不在'foo2'上實例化另一個'new Foo()'並且將它的''b'分配給'99'? – choz

回答

1

Object.assign只複製自己枚舉屬性,繼承class方法都沒有。

但你不會想反正複製這些 - 克隆一個例子,你想創建一個從相同的原型繼承的對象:

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

看來答案是,開箱,沒有這是不可能的。

使用像lodash這樣有用的實用程序庫,特別是它的cloneDeep方法似乎是確定的方法。

相關問題