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(使用前将#替换为@)