一,原型链
1,理解原型:
- prototype就是原型,__proto__称为隐式原型。前后有两个下划线。
- 每一个函数都有一个prototype属性。每个函数都会有很多属性(因为函数也是对象,而对象是属性的集合),其中一定有一个prototype属性。它的值是一个对象。
- 函数的prototype属性是一个对象,这个对象中有很多方法,但是一定会有一个方法:constructor.
console.log(f===f.prototype.constructor); //true这个constructor指向这个函数本身。
对于函数而言,每一个函数都会有一个prototype和一个__proto__属性。
对象的__proto__属性指向创建这个对象的函数的prototype
2,构造器的原型
找出Object,Array,Sting的prototype.
3,原型链
定义;
如果访问一个对象的属性时,先在这个对象自己的属性中去找,
如果找不到,则沿着__proto__这个属性向中找,
如果__proto__这个对象中还是没有找到,就在__proto__对象的__proto__属性中去找,
依次下去,这就是原型链。apply和call这两个方法是我们用来实现继承非常重要的工具
关于__proto__与prototype的使用原则:
- 由于对象的__proto__[隐式原型]与创建这个对象的函数(构造器)的prototype是一致的。
所以理论上,你对__proto__修改会直接影响prototype。
二,作用域链
- 每一个代码在调用时,都会产生一个执行上下文
- 执行函数代码就会产生一个函数执行上下文;执行全局代码就会产生一个全局执行上下文
- 全局执行上下文只有一个。函数执行上下文会有多个。
- 执行上下文的作用:函数(代码)在执行的过程中,需要的一切数据都由执行上下文来提供。数据包含:变量,函数。
全局执行上下文:可以理解为window对象
函数嵌套调用形成执行上下文栈