2017-03-11 80 views
1

我簡單地試圖克隆打字稿中的實例。克隆打字稿中的類實例

jQuery.extend(true, {}, instance)

不起作用,因爲方法不復制

任何幫助是極大的讚賞

+0

請定義克隆實例。即使在概念模糊的流行語言如Java中,似乎也沒有人會同意它的實際含義。 –

+0

無論如何,嘗試'Object.create(instance.prototype)' –

+0

@AluanHaddad thx爲您的快速回復,不幸的是這不適用於TS –

回答

3

你可以有一個通用的克隆功能,如果你的類有一個默認的構造函數:

function clone<T>(instance: T): T { 
    const copy = new (instance.constructor as { new(): T })(); 
    Object.assign(copy, instance); 
    return copy; 
} 

例如:

class A { 
    private _num: number; 
    private _str: string; 

    get num() { 
     return this._num; 
    } 

    set num(value: number) { 
     this._num = value; 
    } 

    get str() { 
     return this._str; 
    } 

    set str(value: string) { 
     this._str = value; 
    } 
} 

let a = new A(); 
a.num = 3; 
a.str = "string"; 

let b = clone(a); 
console.log(b.num); // 3 
console.log(b.str); // "string" 

code in playground

如果你的等級比較複雜(有其他類的實例成員和/或不具有默認的構造函數),然後在你的類添加一個clone方法,知道如何構建和賦值。

+0

感謝您的回答至關重要。在這種情況下,我需要確保我從不使用構造函數,而是使用工廠和設置器?歡呼聲 –

+0

好吧,然後導出工廠函數和克隆函數,但不要導出類本身 –