关于继承

继承
就是子类 继承 父类 所有的属性和方法
 
构造函数继承原理 : 
    调用父类构造函数,并改变其中的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 
  
总结闭包特点 : 
    函数嵌套函数
    函数内部可以引用外部的参数和变量
    参数和变量不会被垃圾回收机制回收
    返回的函数可以存储在外部变量中
 
 
 
原文地址:https://www.cnblogs.com/cqdd/p/10363108.html