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


@Override 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));
}
@Override 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; }
@Override public Message clone() { try { return (Message) super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return null; }}



更多精彩内容:(点击即可阅读)



从JS深浅拷贝谈原型设计模式


扫描二维码

关注我


了解更多事物!


以上是关于从JS深浅拷贝谈原型设计模式的主要内容,如果未能解决你的问题,请参考以下文章

设计模式---原型模式

原型模式

浅谈深浅拷贝

浅谈关于java中的深浅拷贝

设计模式-原型模式

python——赋值与深浅拷贝