继承 :
就是子类 继承 父类 所有的属性和方法
构造函数继承原理 :
调用父类构造函数,并改变其中的this指向
1、继承方式一 : 通过改变父类的执行环境 实现继承
function Parent(){
this.money = 99999999999999999;
this.sing = function(){
console.log("会唱歌");
}
}
function Son(){
在子类中定义一个属性 指向父类的构造函数
this.pre = Parent;
在子类中调用父类
this.pre();
}
2、继承方式二、使用call或apply继承或bind继承 (构造函数继承)
原理 : 在子类中使用call或apply的方式调用父类 让父类中的this指向子类new出来的对象
call和apply的区别 :
call的第二个参数个数不固定
apply的第二个参数是一个数组 这个数组可以使用arguments来代替
用法 :
父类.call( this指向 , 继承属性 )
父类.apply( this指向 , [继承属性] )
bind也可以实现继承 :
父类.bind(this指向)(继承属性)
总结call和apply :
可以执行函数
可以带入参数
可以改变调用函数中this的指向
不能用于创建函数
3、原型继承 (原型链继承)
让子类的原型对象指向父类的实例
子类.prototype = new 父类()
4、混合继承 混合了构造函数继承和原型链继承
使用call或apply方式 继承实例属性 和 实例方法
使用原型继承 继承 原型方法
5、ES6的继承
class Son extends Father{
constructor(name,age,score){
super(name,age);//继承父类的属性和方法
this.score = score;//子类特有的属性
}
//子类特有的方法
study(){
return "学习ing";
}
}
ES6继承中super指向的对象可以是:
父类的构造函数
父类
父类的原型对象
不会指向父类的原型方法
6、闭包
一个函数内部返回一个匿名函数,这个匿名函数就称为闭包
在一个函数内部可以访问到另一个函数内的局部变量 这个函数称为闭包
闭包的形式多样,但都是局部函数全局执行
闭包是指有权访问另一个函数作用域中的变量的函数
闭包作用 :
可以访问一个函数内部的私有变量
通过闭包 可以延长一个局部变量的生命周期 将一个函数内部的私有变量长期驻留在内存里
注意 : 闭包中的this 指向 window
总结闭包特点 :
函数嵌套函数
函数内部可以引用外部的参数和变量
参数和变量不会被垃圾回收机制回收
返回的函数可以存储在外部变量中