JS第一座大山——原型

39 阅读2分钟
  • 一般来说,要把程序加载到内存才能运行
  • 线程不是进程,线程是一种比进程更轻量的概念
  • JS 只能单线程执行
  • 双击 Chrome 快捷方式,会启动一个 Chrome 进程,这个进程会启动其他子进程

JS引擎的功能

  • 编译 JS 代码为字节码或者机器码

  • 优化字节码或者机器码

  • 执行字节码或者机器码

  • 垃圾回收

内存中,Stack 和 Heap 的区别

  • Stack 必须顺序存储数据,让数据一个接一个排列
  • Heap 随机存储数据

浏览器为JavaScript代码的执行创造了『运行环境』,提供一系列的API。

所以window实际上是浏览器提供的,并不存在于JS世界,window上这个对象面挂载了console、document、setTimeout……还有Object、Array和Function函数

一般来说,我们创建数组、对象和函数会这么写,其实是简写形式

 var array = [1,2,3]
 function f(x,y){return x+y}

它们等价于:

 var array = new Array(1,2,3)
 var f = new Funtion('x','y','return x+y')
 

prototype__proto__是什么

首先看下面这段代码

 let obj = {}
 obj.toString()
复制代码

obj这个对象没有toString属性,为什么不会报错?

obj对象有个隐藏属性,也就是上图的__proto__,这个隐藏属性存储了Object.prototype对象的地址

代码执行到obj.toString(),发现obj身上没有toString,就会去隐藏属性对应的对象里面找,于是就找到了Object.prototype.toString

如果再创建一个新对象obj2呢?

 let obj2 = {}
 obj2.toString()
复制代码

也是不会报错的,和obj一样,都可以调用.toString()

那么,我们可以得出一个结论

每个对象都有一个隐藏属性__proto__, 存储着其共有属性组成的对象的地址, 这个共有属性组成的对象叫做原型

prototype和__proto__区别是什么

都存着原型的地址

只不过prototype挂在函数上

___proto__挂在每个新生成的对象上

图片.png

最后:

  1. 对象.__proto__ === 其构造函数.prototype
  1. Object.prototype是所有对象的(直接或间接)原型
  1. 函数.__proto__ === Function.prototype