JavaScript的三座大山—原型随记

141 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第4天,点击查看活动详情

打开一个网页浏览器使用的功能

  1. 发起请求,下载HTML,解析HTML,下载CSS,解析CSS,渲染界面,下载JS,解析JS,执行JS等。
  2. 功能模块:用户界面、渲染引擎JS引擎、存储等。(功能模块一般处于不同的线程)
    //一般情况下,解析HTML与下载CSS可以同时进行,但HTML下载与JS解析分情况,若JS改变其样式则不能同时给进行。

JS一般是单线程的,如果JS需要使用渲染,则JS引擎与渲染引擎进行跨线程通讯。

JS引擎

JS引擎举例:

  • Chrome用的是V8引擎,C++编写。
  • 网景使用的是SpiderMonkey,后来被Firefox使用,C++。
  • Safari用的是JavascriptCore。
  • IE使用的是Chakra(JScript9)
  • Edge使用的是Chakra(JavaScript),最新版本使用的是V8引擎。
  • Node.js使用的是V8引擎。

主要功能:

  • 编译:把JS代码翻译为机器能执行的字节码或者机器码。
  • 优化:改写代码,使其更高效。
  • 执行:执行上面的字节码或者机器码。
  • 垃圾回收:把JS用完的内存回收,方便之后再次使用。

内存使用

image.png

内存被各程序瓜分,操作系统占据一部分,Chrome占据一部分,辅助进程和各页面占据一部分,其中每个页面有渲染线程,用户界面,JS引擎。
JS引擎将JS代码放入代码区,将代码中变量放置一个区域内,然后将之放入栈和堆中。上图并不完整。
Stack区特点:每个数据顺序存放。
Heap区特点:每个数据随机存放。

image.png

规律:数据分两种,对象和非对象。

  • 非对象都存在stack。
  • 对象都存在Heap。

Window

console.dir(window.Object) 可以打印出Object的结构

window变量在内存中占用: image.png

另一种画法:

image.png 关于Window:

  • window变量和window对象是两个东西
  • window变量是一个容器,存放window对象的地址
  • window是Heap中的数据

同理:

  • console和console对象也不是一个东西,一个是属性存放地址,一个是对象存放数据。

原型链

image.png

var obj = {} 
obj.toString()

为什么可以不报错?

  • obj有一个隐藏属性
  • 隐藏属性存储了Object.prototype对象的地址
  • obj.toString()发现obj上没有toSting,于是就进入隐藏属性对应的对象内寻找,找到了Object.prototype里的toString。

原型可以让使用者不用声明,就可以调用其共有属性。
隐藏属性指向共有属性,共有属性就是原型。

prototype与__proto__的区别

都存着原型的地址,只不过prototype挂在函数上,__ proto __ 挂在每个新生成的对象上。