从JS深浅拷贝谈原型设计模式
Posted Web架构开发
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从JS深浅拷贝谈原型设计模式相关的知识,希望对你有一定的参考价值。
“ 学习,一定要立足于长久不变的东西,比如设计思想,模式。”
深浅拷贝在后端用的不多,当一个对象的初始化非常耗时时,但又要多次创建此对象的不变版本,在这种初始化的信息不发生变化的情况下,我们就要用到深浅拷贝,这既隐藏了对象创建的细节,又对性能是大大的提高,这样我们不用重新初始化对象,只是动态的获得对象运行时的状态就可以得到一个对象。
前端开发中,当获得服务器返回的数据后,我想把这一份数据赋值给第二个对象也使用,当我使用时改变了赋值给我的数据,却发现第一份数据也跟着变了,这种情况下,我不希望第一份数据跟着变,我就要复制一份数据,使得它们不存在任何引用关系。
01
—
浅拷贝
let source = {
id: 1,
name: 'andy',
msg: {
age: 18
}
}
// 浅拷贝
function shallowCopy(source) {
let target = {}
for (let attr in source) {
target[attr] = source[attr]
}
return target
}
console.log(shallowCopy(source))
// ES6 语法糖浅拷贝
let target = {}
console.log(Object.assign(target, source))
02
—
深拷贝
// 深拷贝
function deepCopy(target, source) {
for (let attr in source) {
let item = source[attr]
if (item instanceof Array) {
// 引用 - 数组 要写在最上面,数组也属于对象类型,不然数组按对象解析就错了
target[attr] = []
deepCopy(target[attr], item)
} else if (item instanceof Object) {
// 引用 - 对象
target[attr] = {}
deepCopy(target[attr], item)
} else {
// 基本类型
target[attr] = item
}
}
}
console.log('deep copy start')
target = {}
deepCopy(target, source)
console.log(target)
target.msg.age = 20
console.log(target)
console.log(source)
03
—
谈谈原型设计模式
原型模式(Prototype)用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。原型模式其实就是从一个对象再创建另外一个可定制的对象,而且不需知道任何创建的细节。
/**
* 原型类
* 声明一个克隆自身的接口
*/
public interface Prototype {
Prototype clone();
}
import java.util.Objects;
/**
* 具体实现类,实现一个克隆自身的操作
*/
public class ConcretePrototype implements Prototype, Cloneable {
private Integer id;
private String name;
private Message message;
ConcretePrototype(Integer id, String name, Message message) {
super();
this.id = id;
this.name = name;
this.message = message;
}
public ConcretePrototype clone() {
try {
ConcretePrototype prototype = (ConcretePrototype)super.clone();
prototype.message = this.message.clone();
return prototype;
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return null;
}
public static void main(String[] args) {
ConcretePrototype prototype = new ConcretePrototype(1, "o1", new Message(18));
System.out.println("source obj is " + prototype);
System.out.println("source obj hashcode is " + prototype.hashCode());
ConcretePrototype clone = prototype.clone();
System.out.println("target obj is " + clone);
System.out.println("target obj hashcode is " + clone.hashCode());
System.out.println("source and target is equals ? " + Objects.equals(prototype, clone));
}
public String toString() {
return "Prototype{" +
"id=" + id +
", name='" + name + '\'' +
", message=" + message +
'}';
}
}
public class Message implements Cloneable {
private int age;
Message(int age) {
this.age = age;
}
public Message clone() {
try {
return (Message) super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return null;
}
}
更多精彩内容:(点击即可阅读)
扫描二维码
关注我
了解更多事物!
以上是关于从JS深浅拷贝谈原型设计模式的主要内容,如果未能解决你的问题,请参考以下文章