JavaScript 的内存世界与原型链

257 阅读1分钟

内存世界

上图我们可以简单的看作电脑内存,我们的JS代码就存放在代码区,变量存放在不知道什么区,而数据则专门存放在Stack(栈区),Heap(堆区)中。

  • stack与heap的区别
  1. stack存放对象(string number booleans),顺序存放
  2. heap存放非对象,随机存放

对象的篡改

var person = {name : "jack"};
var person2 = person;
person2.name = "ryan"
console.log(person.name)

此时,person的name也被篡改为ryan。

我们可以看到,person和person2其实指向的是同一个地址,所以,无论变更哪一个变量,另一个变量的数据都会随之改变。


window

我们常用的全局变量通常都是挂在window下面的,例如:Object,Arrary,console,document,Function。

通过上面的对象篡改,我们也可以将变量进行篡改(全局变量不可被篡改)


原型链

从上图中,我们可以看到window下分别有多个全局变量,例如Object,Arrary,

他们分别指向了另一个地址,

那个地址中的prototype又分别指向另一个地址。

当我们使用obj或arr时,会通过__proto__ 指向各自的Prototype对应的地址,调用其中的内容。故称为原型链。

__proto__的作用就在于将其与Prototype隔离开来,使其无法被篡改。