克隆TypeScript对象

mwi*_*ild 11 javascript clone typescript

我有一个打字稿类

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;
  }

}
Run Code Online (Sandbox Code Playgroud)

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

restaurant:Restaurant = new Restaurant(1,"TestRest");
Run Code Online (Sandbox Code Playgroud)

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

cache.store( restaurant );
Run Code Online (Sandbox Code Playgroud)

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

var restToEdit = cache.get( "1" );
restToEdit.setName( "NewName" );
Run Code Online (Sandbox Code Playgroud)

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

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

我已经尝试过使用jQuery.clone和extend,但它似乎不起作用,我认为这是因为它是一个打字稿对象.或者那不重要吗?

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

谢谢

Bru*_*der 17

我知道,我知道,JQuery还不够

  • `Object.assign` 带有引用的副本。 (2认同)
  • 使用Json.parse然后使用Json.stringify会丢失分配给该对象的函数 (2认同)

小智 5

这似乎对我有用:

var newObject = Object.assign(Object.create(oldObj), oldObj)
Run Code Online (Sandbox Code Playgroud)

Object.create 创建一个具有空属性的新实例 Object.assign 然后采用该新实例并分配属性

克隆函数的更强大版本

    clone(obj) {
        if(Array.isArray(obj)) {
            return Array.from(obj);
        } else {
            return Object.assign(Object.create(obj), obj);
        }
    }
Run Code Online (Sandbox Code Playgroud)

  • 只进行浅克隆。任何引用仍然指向原始对象中的相同对象。 (2认同)

Adn*_*mer 1

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

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

// Deep copy
var newObject = jQuery.extend(true, {}, oldObject);
Run Code Online (Sandbox Code Playgroud)

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

演示:

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

// Deep copy
var newObject = jQuery.extend(true, {}, oldObject);
Run Code Online (Sandbox Code Playgroud)
// 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);
Run Code Online (Sandbox Code Playgroud)