王福朋:深刻理解javascript原型和闭包javascript
一切都是对象html
对象就是属性的集合,也就是一堆键值对,就连函数也是对象。java
函数与对象的关系浏览器
- 对象都是经过函数来建立的
- 每一个函数都有一个属性,叫作prototype,属性值是一个对象,该对象默认只有一个属性,constructor指向函数自己 ``` function.prototype // key = prototype, value = Object
function.prototype.contructor --> function ``` 3. 每一个对象都有一个隐藏的属性,"__proto__",这个属性指向建立这个对象的函数(对象)的prototype属性闭包

原型app
- 自定义函数的prototype指向一个对象,该对象的__proto__指向Object.prototype
- 自定义函数做为对象,它的__proto__指向Function.prototype
- Object.prototype指向null
- Function.__proto__指向Function.prototype
继承函数
- A instanceof B,instanceof表示一种关系,或者原型链的结构
- A对象的__proto__和B函数的prototype,若是能找到同一个引用,则为true
- 访问一个对象的属性时。如今基本属性中查找,若是没有,再沿着__proto__这条链想上找,这就是原型链
执行上下文this
在一段js代码执行以前,浏览器先作一些准备工做prototype
- 变量、函数表达式(var a = fn(){}),变量声明,默认赋值为undefined
- this,赋值
- 函数声明,赋值
js代码的执行上下文,相似于java中加载类时的初始化过程。htm
this
分四种状况
- 构造函数中的this,new的时候表明它即将new出来的对象,直接调用时则不同
- 函数做为对象的一个属性被调用时,this指向该对象
- 函数用call或者apply调用,this指向传入的对象
- 全局、调用普通函数,this指向window
做用域
- js没有块级做用域
- 除了全局做用域以外,只有函数能够建立做用域
- 对于没有在本做用域声明的自由变量,取值要到建立这个函数的那个做用域中取值
闭包
- 函数做为返回值
- 函数做为参数被传递
- 以上两种状况,若是函数引用其余做用域中的自由变量,则造成闭包