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->Hello
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.Then中尝试浅拷贝和深拷贝,我运行了上面的代码。我不明白为什么前者是浅薄的拷贝,后者是深的复制。请帮帮我。
发布于 2022-04-11 11:07:39
在第一个代码块中调用new Outer();之后,您的外部this.Text和Inner中的this._Text都指向内存中的同一个对象,这是您在Outer中创建的对象。
{
Message: "Hi"
}这是因为当您将this.Text传递给Inner时,您最终会传递上述对象的引用。因此,this._Text将同一个对象引用到this.Text引用的对象。这意味着当您修改Text对象时,在记录this._Text时也会反映更改,因为Text和_Text都引用同一个对象。
第二个代码块也会发生类似的情况--在执行OuterObject.Text = {Message: "Hello"};之前,this._Text和this.Text都引用内存中的同一个对象(就像在第一个示例中所做的那样),但是,当您重新分配OuterObject.Text = {Message: "Hello"};时,您正在内存中创建一个新对象({Message: "Hello"};),并将对该新对象的引用分配给.Text属性,._Text引用的对象({Message: "Hi"})仍然保持不变,因为您所做的只是更新.Text以指向一个新对象,并且没有更改< code >D23引用或对象。
为了在图表中解释,在这两个代码块中,您最初有以下内容:

在您的第一个代码块中,当您执行OuterObject.Text["Message"] = "Hello";时,您正在更新this.Text和this._Text所指向的内存中的一个对象,这意味着当您查看this._Text.Message时,您将看到"Hello",以及与this.Text.Message相同的对象

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

上面,this.Text指向内存中创建的新对象,而this._Text仍然指向旧对象,因为指向this._Text的指针没有改变。因此,日志记录this._Text仍然显示"Hi"
https://stackoverflow.com/questions/71826447
复制相似问题