复制对象

在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没有任何的关系。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值