一.原型以及原型链
- 1.何为原型?
在javascript里面,每当我们定义一个对象的时候,对象中会包含一些定义好的属性,其中有一个prototype,这个属性指向函数的原型对象,使用原型对象的好处是,对象在实例过后可以共享它里面包含的属性和方法。
| 显示原型 | 隐式原型 |
|---|---|
| 用来实现基于原型的继承与属性的共享 | 用来构成原型练,实现基于原型的继承 |
- 2.何为原型链?
每一个对象都会有一个原型对象,通过proto指向它的原型对象,并且继承他里面的方法和属性,同时原型对象也可能拥有原型,这样一层一层,最终通过Object.prototype._proto_指向null,这种关系被称为原型链,通过原型链一个对象可以拥有定义在其他对象中的属性和方法.
当查找一个对象的属性时,javascript会根据原型链向上遍历对象的原型,直到找到给定的名称的属性的名称为止,如果到达原型链的顶部仍然没有找到指定的属性,就会返回undefined
- 3.prototype和proto的区别是什么?
- prototype是构造函数里面的属性
- _proto_是每个实例都有的属性,可以访问prototype属性
- 实例的_proto_与其构造函数的prototype指向的是同一个对象
原型链查找流程图 (function创建一个类 实例化这个类为p1,添加一个play方法,查找play方法)
看是否有该方法-->有的话直接调用-->没有的话使用p1.proto查找-->有的话调用-->没有的话使用person.prototype-->有的话调用-->没有的话使用person.prototype.proto-->有的话调用—->没有的话使用object.prototype-->有的话调用-->没有的话使用object.prototype.proto-->这就是最顶层了,再找不到就直接是null了,是原型链的顶级.
原型和原型链的区别
原型是为了实现对象间的联系,解决构造函数无法共享而引入的一个属性
原型链是一个实现对象间联系即继承的主要方法
二.作用域以及作用域链
- 1.何为作用域?
作用域就是变量和函数的可访问范围
| 名称 | 作用 |
|---|---|
| 全局作用域 | 定义在window的变量,任何地方都可以访问 |
| 局部作用域 | 只在函数内部定义的变量范围 |
| 块级作用域 | let const就被认为是块级作用域的变量 for循环里面定义的let if里面用let定义的变量 |
注:尽量不要使用全局变量会有 1.全局污染 2.命名冲突 3.不易查找bug
1.何为作用域链?
由最内部的作用域往最外部,查找变量的过程,形成的链条就是作用域链
注:作用域链找到的最外层一直找到的就是window