1. 程式人生 > 實用技巧 >Vue JS 自學筆記

Vue JS 自學筆記

定義

首先建立一個例項,然後通過這個例項去拷貝建立新的例項。

關係

        Student student = new Student("xiaoming", new Bag("nick"));
        Student clone = (Student) student.clone();

通過clone的方式來構造物件

注意的點

1、克隆物件不會呼叫構造方法

從上面的輸出其實我們也可以發現,構造方法只在一開始我們建立原型的時候輸出了,fileB和fileC都沒有呼叫構造方法,這是因為執行clone方法的時候是直接從記憶體中去獲取資料的,在第一次建立物件的時候就會把資料在記憶體保留一份,克隆的時候直接呼叫就好了

2、訪問許可權對原型模式無效

原理也很簡單,我們是從記憶體中直接複製的,所以克隆起來也會直接無視,複製相應的內容就好了。

使用場景

當我們的類初始化需要消耗很多的資源時,就可以使用原型模式,因為我們的克隆不會執行構造方法,避免了初始化佔有的時間和空間。

深拷貝和淺拷貝

淺拷貝

如果只是呼叫super.clone()則實現的淺拷貝
只是對於引用型別的成員變數,只是複製的是其引用。

深拷貝

對於深拷貝,引用型別的變數是實現的拷貝的完整的物件,而不是引用地址

public class Student implements Cloneable {

    private String name;

    private Bag bag;

    public Student(String name, Bag bag) {
        this.name = name;
        this.bag = bag;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Bag getBag() {
        return bag;
    }

    public void setBag(Bag bag) {
        this.bag = bag;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        Student ans = (Student) super.clone();
        ans.setBag((Bag) ans.getBag().clone());
        return ans;
    }
}

public class Bag implements Cloneable {
    private String brand;

    public Bag(String brand) {
        this.brand = brand;
    }

    public String getBrand() {
        return brand;
    }

    public void setBrand(String brand) {
        this.brand = brand;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

實現深拷貝的方式

除了以上的方式,還有一種經典方式是通過序列化和反序列化,但是由於序列化和反序列化涉及到了檔案的操作,所以效率不如重新clone方法的方式。