Клонирование объекта TypeScript

у меня есть класс 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;
  }

}

у меня тогда есть экземпляр этого класса (это пример ):

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

затем я храню этот объект ресторана в каком-то кэше

cache.store( restaurant );

затем позже в моем приложении я получаю ресторан обратно

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

но из-за javascripts проходят по ссылке на объекты, изменения, которые я делаю для restToEdit, также сохраняются в ресторане, который находится в кэше.

Я в принципе хотите, чтобы ресторан в кэше был совершенно другим экземпляром restToEdit.

Я пробовал использовать jQuery.клонирование и расширение, но это, похоже, не работает, и я думаю, что это из-за того, что это объект typescript. Или это не имеет значения?

любые ответы о том, как клонировать этот объект, будут оценены

спасибо

4 ответов


.clone () только клоны элементов DOM. Для клонирования объектов JavaScript попробуйте С помощью jQuery.продлить. Что-то вроде этого!--8-->

// 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>

  • используя стандартные возможности ES6

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

    предупреждение: это выполняет неглубокий клон.

    этой отличная страница из MDN содержит тонны деталей о клонировании, включая polyfill для ES5

  • "быстрый" способ глубокого клонирования-использовать JSON утилиты

    const clone = JSON.parse(JSON.stringify(myObject))
    
  • "правильный" способ клонирования заключается в реализации метода клонирования или копии конструктор...

Я знаю, я знаю, недостаточно JQuery


Это, кажется, работает для меня:

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

Если вы используете TS 2.1, вы можете использовать оператор распространения объектов для создания неглубокой копии:

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