JS内存浅解&原型
JS将JS引擎中的内存区分划分成:
- 
代码区:存放代码 
- 
不知道什么区:存放变量名 
- 
数据区:存放数据 
- Stack区:栈,顺序存储,连续存储
- Heap区:堆,随机存储,链接存储
 
- 
其他区域,在此不深究 
Stack与Heap
数据分为:
- 
非对象:数值、字符串、布尔,存放在Stack中 
- 
对象:其他,存放在Heap中 
传值与传址:
b=a
=总是会把右边的东西复制到左边
如果a为非对象数据,则Stack区中存放的是a的值,那么=传值
如果a为对象数据,则Stack区中存放的是a对应数据所在Heap区中的地址,那么=传址,会出现篡改对象的情况
| 12
 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
| 12
 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'
 
 
 
 > a.__proto__.toString = "3"
 < '3'
 
 > b.toString
 < '3'
 
 
 
 > Object.prototype.xxx = "111"
 < '111'
 
 > a.xxx
 < '111'
 
 
 
 > b.__proto__.yyy = "222"
 < '222'
 
 > a.yyy
 < '222'
 
 
 
 
 |