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