Lon*_*ike 1 javascript javascript-objects
假设在Javascript中创建了一个新的Object,它使用一种方法将数据设置为创建的实例.
我想知道,当添加数据时,数据会在内存中存在两次还是newObj.data和数据只是指向内存中的相同地址?
let data = {text: 'a text'};
let newObj = Object.create({
setData(argData) {
this.data = argData;
}
});
// is data and newObj.data twice in memory now?
Run Code Online (Sandbox Code Playgroud)
如果可能已经提出类似的问题,我会提前道歉(这就是编写本文时的编辑提示).我是这样,我还没找到他们.可能是他们的表述不同,但我不知道如何以任何其他方式提出这个问题.
我想知道,当添加数据时,数据会在内存中存在两次还是newObj.data和数据只是指向内存中的相同地址?
后者.什么得举办newObj.data和data一些所谓的对象引用,而不是对象本身.对象在内存中的其他地方(只有一次); 引用是告诉JavaScript引擎对象所在的值.
这假设你实际上打过电话newObj.setData(data).只是它Object.create自己没有设置data属性newObj.
让我们抛出一些ASCII艺术.执行此操作后:
let data = {text: 'a text'};
let newObj = Object.create({
setData(argData) {
this.data = argData;
}
});
Run Code Online (Sandbox Code Playgroud)
...你在记忆中有这样的东西(省略了各种细节):
+????????????????+
data:[Ref54611]???????????????????????????????>| (object) |
+????????????????+
| [[Prototype]] |??+
| text: 'a text' | |
+????????????????+ |
|
+????????????????+ +?>(Object.prototype)
newObj:[Ref74135]???>| (object) | |
+????????????????+ +????????????????????+ |
| [[Prototype]] |???>| (object) | |
| text: 'a text' | +????????????????????+ |
+????????????????+ | [[Prototype]] |??+
| setData:[Ref55462] |????>(function)
+????????????????????+
然后:
newObj.setData(data);
Run Code Online (Sandbox Code Playgroud)
......你有类似的东西:
+????????????????????????????????????????????????+
| |
\ +????????????????+ |
data:[Ref54611]??????????????????????????????+??>| (object) | |
+????????????????+ |
| [[Prototype]] |??+ |
| text: 'a text' | | |
+????????????????+ | |
\ |
+??????????????????+ +?>(Object.prototype) |
newObj:[Ref74135]???>| (object) | / |
+??????????????????+ +????????????????????+ | |
| [[Prototype]] |???>| (object) | | |
| text: 'a text' | +????????????????????+ | |
| data: [Ref54611] |??+ | [[Prototype]] |??+ |
+??????????????????+ | | setData:[Ref55462] |????>(function) |
| +????????????????????+ |
| |
+?????????????????????????????????????????????????+
注意,概念值"[Ref54611]"同时包含data(变量)和newObj.data(属性).您实际上从未在代码中看到对象引用的值,但您可以将它们视为数字,告诉引擎对象的位置.
| 归档时间: |
|
| 查看次数: |
54 次 |
| 最近记录: |