一. 什么是原型?
js中所有的引用类型都有一个__proto__的隐式属性, 所有的函数都有一个prototype的显示属性(通常强调构造函数), 引用类型的对象中的__proto__隐式属性,这就是一个普通的对象,也称隐式原型,它指向构造函数的prototype显示属性,这个显示属性就是原型对象。
原型有什么作用呢?
二. 什么是原型链?
当访问一个对象的某个属性时,会先在这个对象本身属性上查找,如果没有找到,则会去它__proto__隐式原型上查找,即它的构造函数的prototype,如果还没有找到就会再在构造函数的prototype的__proto__中查找,这样一层一层向上查找就会形成一个链式结构,我们称为原型链。
此处new操作符经历的过程
1.现在内存中创建一个对象 let fn = {} 2.this指向这个对象,也就是this = fn 3.将函数的显示原型prototype赋值给前面创建出来的对象的隐式原型,这里也就是obj2.__ proto __ = Object.prototype 4.如果构造函数没有对象,则返回空值。反之返回创建出来的新对象(fn)。这里也就是return this。
作用域的类型
Javascript中有三种作用域:
- 全局作用域;
- 函数作用域;
- 块级作用域(ES6引入了
let和const关键字,和var关键字不同,在大括号中使用let和const声明的变量存在于块级作用域中。在大括号之外不能访问这些变量);
三、作用域链
1.什么是作用域
简单来说,作用域(英文:scope)是据名称来查找变量的一套规则,可以把作用域通俗理解为一个封闭的空间,这个空间是封闭的,不会对外部产生影响,外部空间不能访问内部空间,但是内部空间可以访问将其包裹在内的外部空间。
2.[[Scopes]]属性
[[scope]]就是我们常说的作用域,在javascript中,每个函数都是一个对象,在对象中有些属性我们可以访问,有些我们是不能自由访问的, [[Scopes]]属性就是其中之一,这个属性只能被JavaScript引擎读取。 其中存储了作用域运行期的上下文集合。
2. 当查找变量的时候都发生了什么?
会先从当前上下文的变量对象中查找; 如果没有找到,就会从父级(词法层面上的父级)执行上下文的变量对象中查找; 一直找到全局上下文的变量对象,也就是全局对象; 作用域链的顶端就是全局对象; 这样由多个执行上下文的变量对象构成的链表就叫做作用域链,从某种意义上很类似原型和原型链。
3.作用域链和原型继承查找时的区别:
查找一个普通对象的属性,但是在当前对象和其原型中都找不到时,会返回undefined 查找的属性在作用域链中不存在的话就会抛出ReferenceError。