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