45闭包 原型对象 继承
一、闭包
在函数外部能够读取其他函数内部变量的函数
通俗理解的闭包:一个内部函数引用了外部函数的变量,外部函数形成了一个闭包
例
function fn1(){
let n = 1
function fn2(){
console.log(n)
}
// fn2就是一个闭包函数
return fn2
}
// res就是fn1函数运行的返回值是fn2函数
let res = fn1()
// 调用函数fn2
res()
原理
js中的变量,函数在执行的时候会被加载到栈中,执行完毕再弹出,当使用闭包的时候,函数执行完成后,不会弹出,因为其他的地方还要加载其内部变量
特点
- 使用不当会很容易造成内存泄漏(内存中能存的东西原来越少,像是其他部分被泄露了一样)
- 设置私有变量(内部函数调用外部函数的局部变量,此时,这个局部变量就会变成内部函数的私有变量)
- 闭包的作用 减少变量的声明,避免造成污染
- 内存的占用比较到,浪费内存
二、原型对象
创建的每个函数都有一个protrtype
属性。通过这个属性能够找到原型对象,实例化对象也都有一个__proto__
属性,实例化对象通过这个属性找到原型对象
使用原型对象的好处就是能够将一些公共的方法设置在原型对象,所有的对象实例都能使用这些方法
原型链继承
利用原型让一个引用类型继承另一个引用类型的方法
每一个构造函数都有一个原型对象,原型对象都包含一个指向构造函数的指针,而实例都包含一个指向原型对象的内部指针
原型链的连接点是__proto__
三、call/apply继承
都是改变this的指向,只是传参的形式不同
call
- 作用 调用该函数,并修改函数中的this指向
- 语法 函数名.call(对象, 实参1, 实参2)
第一个参数是this需要指向的对象
后面的参数都是被调用函数需要传入的实参
apply
- 作用 调用该函数,并修改函数中的this指向
- 语法 函数名.apply(对象, 数组)
第一个参数是this需要指向的对象
第二个参数是将需要传入的实参写在一个数组里
bind
- 作用 不调用函数,克隆一个新的函数,并修改新函数中的this指向,将新的函数返回
- 语法 函数名.bind(对象, 实参1, 实参2)
第一个参数是this需要指向的对象
后面的参数都是被调用函数需要传入的实参
需要直接调用函数且修改this的指向,使用call和apply
需要修改this的指向,但是不直接调用函数,让js来调用时,使用bind,一般是在回调函数中使用,比如延时器、定时器、事件函数
四、继承
构造函数继承
能够继承方法,但是属性却不能继承
混合继承
用函数,让js来调用时,使用bind,一般是在回调函数中使用,比如延时器、定时器、事件函数
四、继承
构造函数继承
能够继承方法,但是属性却不能继承
混合继承
使用构造函数 + 原型继承