Javascript Object.create:设置数据时内存会发生什么?

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)

如果可能已经提出类似的问题,我会提前道歉(这就是编写本文时的编辑提示).我是这样,我还没找到他们.可能是他们的表述不同,但我不知道如何以任何其他方式提出这个问题.

T.J*_*der 7

我想知道,当添加数据时,数据会在内存中存在两次还是newObj.data和数据只是指向内存中的相同地址?

后者.什么得举办newObj.datadata一些所谓的对象引用,而不是对象本身.对象在内存中的其他地方(只有一次); 引用是告诉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(属性).您实际上从未在代码中看到对象引用的值,但您可以将它们视为数字,告诉引擎对象的位置.