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