複製物件

zp1996323發表於2015-11-08

在js中物件名,同時也是一個指標,加入直接將一個物件的名字賦值給另外一個物件,兩個物件其實指向的是記憶體中的同一個物件,要想開闢新的記憶體來建立兩個屬性相同,但是地址不同的物件,需要自己構建函式。

var obj = {
    x: 1
}
var obj1 = obj;
obj1.x = 2;
console.log(obj.x);   // 2

obj1的改變也會影響obj的變化,原因就是他們兩個物件指向記憶體中的同一個物件,下面我們重寫一個方法,是兩個物件不在同一塊記憶體上。

var obj = {
    x: 1
}
var obj1 = clone(obj);
obj1.x = 2;
console.log(obj.x);   // 1
function clone (obj) {
    var newObj = {};
    for (var i in obj) {
        if (obj.hasOwnProperty(i)) newObj[i] = obj[i];
    }
    return newObj;
}

所有語言中new的作用就是開闢記憶體,每new一次就會為物件新開闢一塊記憶體。

再看php中物件的複製:

class Animal{
    public $name;
    public $weight;
}
class Dog extends Animal {
    function __construct($host,$name,$weight) {
        $this->host = $host;
        $this->name = $name;
        $this->weight = $weight;
    }
}
$dog = new Dog('wangwang','xixi',10);
$spot = $dog;
$spot->name = "xishao";
echo $dog->name;   // xishao
$other = clone $dog;
$other->name = "shaohui";
echo $dog->name;  // xishao

php中也是像js中的那樣,php中有一個clone關鍵字,可以做到另外開闢記憶體來複制物件,並且在使用clone關鍵字時會呼叫魔術方法__clone()

再看C#中

public class Dog 
{
  public int age;
   public double weight;
   public Dog(int age, double weight) 
   {
       this.age = age;
       this.weight = weight;
   }
}

Dog spot = new Dog(20,10.2);
Dog other = spot;
other.age = 20;
Console.WriteLine(spot.age);  // 20

與php和js一樣,c#也是這麼處理的,但是我們在c#要是使用了泛型,可以就不是這樣子了,c#中的泛型無論是引用型別還是基本型別都會將其看成基本型別來處理。
下面的一個例子是我在做資料結構作業時發現的:
這裡寫圖片描述
我本以為temp的記憶體地址和取出來的Data的地址是一樣的,但是事實上並不是這樣的,temp與這個取出來的Data沒有任何的關係。

相關文章