Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/428.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 克隆TypeScript对象_Javascript_Typescript_Clone - Fatal编程技术网

Javascript 克隆TypeScript对象

Javascript 克隆TypeScript对象,javascript,typescript,clone,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.na

我有一门打字课

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

}
然后我有一个此类的实例(这是一个示例):

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

cache.store( restaurant );
后来在我的申请中,我得到了餐馆

var restToEdit = cache.get( "1" );
restToEdit.setName( "NewName" );
但是由于javascripts在对象上通过引用传递,我对restToEdit所做的更改也会保存在缓存中的餐厅中

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

我尝试过使用jQuery.clone和extend,但它似乎不起作用,我认为这是因为它是一个typescript对象。或者这无关紧要

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

谢谢

仅克隆DOM元素。要克隆JavaScript对象,请尝试。像这样的

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

// Deep copy
var newObject = jQuery.extend(true, {}, oldObject);
Typescript可转换为JavaScript。所以,JavaScript方法将很好地工作

演示:

//TypeScript的传输版本
“严格使用”;
var=(函数(){
功能餐厅(id、名称){
this.id=id;
this.name=名称;
}
Restaurant.prototype.getId=函数(){
返回此.id;
};
Restaurant.prototype.setId=函数(_id){
this.id=\u id;
};
Restaurant.prototype.getName=函数(){
返回此.name;
};
Restaurant.prototype.setName=函数(_name){
this.name=\u name;
};
返回餐厅;
}());
//测试片段
风险值r1=新餐厅(1,“A”);
var r2=jQuery.extend(true,{},r1);
r2.设定名称(“B”);
console.log(r1.name);
console.log(r2.name)
  • 使用标准

    警告:这将执行浅克隆

    这包含了大量关于克隆的详细信息,包括ES5的polyfill

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

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


我知道,我知道,

这似乎适合我:

var newObject = Object.assign(Object.create(oldObj), oldObj)
Object.create创建具有空属性的新实例 Object.assign然后接受该新实例并分配属性

克隆函数的更健壮版本

    clone(obj) {
        if(Array.isArray(obj)) {
            return Array.from(obj);
        } else {
            return Object.assign(Object.create(obj), obj);
        }
    }

如果使用的是TS 2.1,则可以使用“对象扩展”操作符创建浅复制:

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

Object.assign
使用引用复制。使用Json.parse然后使用Json.stringify会丢失分配给object@JaganathanBantheswaran ... 如果您的浅层克隆或克隆不可变属性,这是非常好的!在Typescript中使用Object.assign感觉不正确。显然,我知道一旦编译成js就可以了,但我觉得这不是我的解决方案&尽管如此,我还是想要一个深度克隆,正如我解释的那样,属性不是immutable@JaganathanBantheswaranangular.copy在angular 2Tanks中不可用,可以使用。只是觉得打字不对劲。我不喜欢在typescript中使用Javascript代码,因为我知道它可以工作。但目前看来,这似乎是唯一的解决办法。谢谢您可以在类/prototype中完成它:
public clone():Restaurant{/*相同的jquery代码,只需返回r2*/}
仅执行浅层克隆。任何引用仍然指向原始对象中的相同对象。我建议使用
object.create(object.getPrototypeOf(obj))
而不是
object.create(obj)
。当前代码存在下一个问题:如果
obj
在复制期间有一个
未定义的属性
,那么在将该属性更改为原始
obj
中的某个值后,克隆将看到更改。
    clone(obj) {
        if(Array.isArray(obj)) {
            return Array.from(obj);
        } else {
            return Object.assign(Object.create(obj), obj);
        }
    }
const obj = { a: 1 };
const clonedObj = { ...obj };