浅拷贝、深拷贝

2024-05-15

const Inner = function(Text) {
  this._Text = Text;
  this.Alert = () => {
    alert(this._Text["Message"]);
  }
};
const Outer = function() {
  this.Text = {
    Message: "Hi"
  };
  this.Inner = new Inner(this.Text);
  this.Alert = this.Inner.Alert;
};
const OuterObject = new Outer();
OuterObject.Alert();
OuterObject.Text["Message"] = "Hello";
OuterObject.Alert();

输出:嗨->你好

const Inner = function(Text) {
  this._Text = Text;
  this.Alert = () => {
    alert(this._Text["Message"]);
  }
};
const Outer = function() {
  this.Text = {
    Message: "Hi"
  };
  this.Inner = new Inner(this.Text);
  this.Alert = this.Inner.Alert;
};
const OuterObject = new Outer();
OuterObject.Alert();
OuterObject.Text = {
  Message: "Hello"
};
OuterObject.Alert();

输出:Hi->Hi

我正在Javascript中尝试浅复制和深复制。然后我运行了上面的代码。 我不明白为什么前者是浅拷贝,后者是深拷贝。 请帮我。


打电话后new Outer();在你的第一个代码块中,你最终会得到两个this.Text内部 外部 和this._Text within Inner指向内存中的同一个对象,即您在其中创建的对象Outer:

{
  Message: "Hi"
}

这是因为当您通过时this.Text to Inner您最终传递了上述对象的引用。因此,this._Text引用同一个对象this.Text指。这意味着当您修改Text对象,更改也会在您登录时反映出来this._Text,因为两者Text and _Text指的是same object.

在执行之前,第二个代码块也会发生类似的情况OuterObject.Text = {Message: "Hello"}; both this._Text and this.Text引用内存中的同一个对象(就像在第一个示例中所做的那样),但是,当您重新分配时OuterObject.Text = {Message: "Hello"};,您正在内存中创建一个新对象({Message: "Hello"};),并将对该新对象的引用分配给.Text属性,对象._Text指 ({Message: "Hi"})仍然存在,因为您所做的只是更新.Text指向一个新对象,并且没有改变this._Text参考或对象。


为了用图表进行解释,在这两个代码块中,您最初具有以下内容:

在你的第一个代码块中,当你这样做时OuterObject.Text["Message"] = "Hello";,您正在更新内存中的一个对象this.Text and this._Text指向,这意味着当您查看this._Text.Message你看"Hello"和同样的this.Text.Message:

在第二个代码块中,第一个图表/情况仍然发生,但第二个图表/情况不会发生,相反,当您执行OuterObject.Text = {Message: "Hello"};你得到以下结构:

Above, this.Text指向在内存中创建的新对象,而this._Text仍然指向旧对象,作为指针this._Text没有改变。所以记录this._Text仍然显示"Hi"

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

浅拷贝、深拷贝 的相关文章

随机推荐