JS内存浅解&原型

JS内存浅解&原型

JS将JS引擎中的内存区分划分成:

  • 代码区:存放代码

  • 不知道什么区:存放变量名

  • 数据区:存放数据

    • Stack区:栈,顺序存储,连续存储
    • Heap区:堆,随机存储,链接存储
  • 其他区域,在此不深究

Stack与Heap

数据分为:

  • 非对象:数值、字符串、布尔,存放在Stack中

  • 对象:其他,存放在Heap中

传值与传址:

b=a

=总是会把右边的东西复制到左边

如果a为非对象数据,则Stack区中存放的是a的值,那么=传值

如果a为对象数据,则Stack区中存放的是a对应数据所在Heap区中的地址,那么=传址,会出现篡改对象的情况

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
> var a = "1"
< undefined

> a
< '1'

> var b = a
< undefined

> b
< '1'

> a = "2"
< '2'

> b
< '1'

---------------

> var a = {name: "w"}
< undefined

> var b = a
< undefined

> a
< {name: 'w'}

> b
< {name: 'w'}

> b.name = "1"
< '1'

> a.name
< '1'

prototype 与 prototype chain

几乎每个首字母大写的对象都有一个prototype属性,例如Object、Array、Function等。

例如:

Object.prototype中存储了Object对象的共同属性,所有Object对象都可以使用,因为所有的Object对象中都有一个__proto__的隐藏属性,对应着Object.prototype,这就是prototype chain

prototype属性和__proto__属性区别

prototype属性和__proto__属性都只存储了prototype的地址,prototype属性挂靠在每个函数上,__proto__属性挂靠在每个新生成的对象上

tips

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
> var a = {}
< undefined

> var b = {}
< undefined

> Object.prototype.toString = "1"
< '1'

> a.toString
< '1'

> b.toString
< '1'

> a.toString = "2"
< '2'

> b.toString
< '1'

//**读取数据时才会通过__proto__,写入时不通过__proto__**//

> a.__proto__.toString = "3"
< '3'

> b.toString
< '3'

//**写完整就可以在对象中修改函数的prototype属性**//

> Object.prototype.xxx = "111"
< '111'

> a.xxx
< '111'

//**函数的prototype属性中可以新增**//

> b.__proto__.yyy = "222"
< '222'

> a.yyy
< '222'

//**函数的prototype属性中可以通过对象新增**//


JS内存浅解&原型
https://bald3r.wang/2022/06/07/JS内存浅解/
作者
Allen
发布于
2022年6月7日
许可协议