克隆TypeScript对象

时间:2016-10-03 13:49:52

标签: javascript typescript clone

我有一个打字稿类

export class Restaurant {

  constructor ( private id: string, private name: string ) {

  }

  public getId() : string {
    return this.id;
  }

  public setId(_id : string) {
    this.id = _id;
  }

  public getName () {
    return this.name;
  }

  public setName ( _name:string ) {
    this.name = _name;
  }

}

然后我有一个这个类的实例(这是一个例子):

restaurant:Restaurant = new Restaurant(1,"TestRest");

然后我将这个餐馆对象存储在某种缓存中

cache.store( restaurant );

然后在我的申请表中我回到了餐馆

var restToEdit = cache.get( "1" );
restToEdit.setName( "NewName" );

但由于javascripts通过引用传递对象,我对restToEdit的更改也会保存在缓存中的餐馆中。

我基本上希望缓存中的餐厅与restToEdit完全不同。

我尝试过使用jQuery.clone并进行扩展,但它似乎不起作用,我认为这是因为它是一个打字稿对象。或者那不重要吗?

有关如何克隆此对象的任何答案将不胜感激

由于

4 个答案:

答案 0 :(得分:16)

  • 使用标准ES6 features

    const clone = Object.assign({}, myObject)
    

    警告:这会执行浅层克隆。

    excellent page from MDN包含大量有关克隆的详细信息,包括ES5的polyfill

  • 深度克隆的“快速”方式是使用JSON实用程序

    const clone = JSON.parse(JSON.stringify(myObject))
    
  • 克隆的“正确”方法是实现克隆方法或复制构造函数......

我知道,我知道, not enough JQuery

答案 1 :(得分:4)

这似乎对我有用:

PieEntry

Object.create创建一个具有空属性的新实例 然后,Object.assign接受新实例并分配属性

更强大的克隆功能版本

var newObject = Object.assign(Object.create(oldObj), oldObj)

答案 2 :(得分:3)

如果您正在使用TS 2.1,则可以使用对象扩展运算符来创建浅层副本:

const obj = { a: 1 };
const clonedObj = { ...obj };

答案 3 :(得分:1)

.clone()仅克隆DOM元素。要克隆JavaScript对象,请尝试jQuery.extend。像这样的东西

// Shallow copy
var newObject = jQuery.extend({}, oldObject);

// Deep copy
var newObject = jQuery.extend(true, {}, oldObject);

Typescript转换为JavaScript。所以,JavaScript方式可以正常工作。

演示:

// Transpiled version of TypeScript
"use strict";
    var Restaurant = (function () {
        function Restaurant(id, name) {
            this.id = id;
            this.name = name;
        }
        Restaurant.prototype.getId = function () {
            return this.id;
        };
        Restaurant.prototype.setId = function (_id) {
            this.id = _id;
        };
        Restaurant.prototype.getName = function () {
            return this.name;
        };
        Restaurant.prototype.setName = function (_name) {
            this.name = _name;
        };
        return Restaurant;
    }());

// Test Snippet
var r1 = new Restaurant(1, "A");
var r2 = jQuery.extend(true, {}, r1);

r2.setName("B");

console.log(r1.name);
console.log(r2.name);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>