高深JS之闭包、创建函数问题、继承

闭包

1.如何产生闭包?
当一个嵌套的内部(子)函数引用了嵌套外部(父)函数的变量(函数)时,就产生了闭包
2.闭包到底是什么?
* 使用chrome调试查看
* 理解一:闭包是嵌套的内部函数(绝大部分人)
* 理解二:包含被引用变量(函数)的对象(小部分人)
* 注意:闭包存在于嵌套的内部函数中
3.产生闭包的条件
函数嵌套
内部函数引用了外部函数的数据(变量/函数)

1.将函数作为另一个函数的返回值
2.将函数作为实参传递给另一个函数调用

作用
1.使用函数内部的变量在函数执行完后,仍然存活在内存中(延长了局部变量的生命周期)
2.让函数外部可以操作(读写)到函数内部的数据(变量/函数)
问题:
1.函数执行完以后,函数内部声明的局部变量是否存在?一般不存在,存在于闭包中的变量才可能存在
2.在函数外部能直接访问函数内部的局部变量?不能,但是通过闭包,让外部操作它

闭包的声明周期 
1.产生:在嵌套内部函数定义执行完时就产生了
2.死亡:在嵌套的内部函数成为垃圾对象时

闭包的应用:定义JS模块
* 具有特定功能的JS模块
* 将所有的数据和功能都封装在一个函数的内部
* 只向外暴露一个包含n个方法的对象或属性
* 模块的使用者,只要通过模块暴露的对象调用方法来实现对应的功能

缺点:
* 函数执行完,函数内的局部变量没有释放,占用内存空间变长
* 容易造成内存泄漏
解决:
能不用闭包就不用
及时释放

创建函数问题

方式一:Object构造函数模式

* 套路:先创建空Object对象,在动态添加属性/方法
* 适用场景:起始时不确定对象内部数据
* 问题:语句太多

方式二:对象字面量模式

* 套路:使用{}创建对象,同时指定属性/方法
* 适用场景:起始时对象内部数据是确定的
* 问题:创建多个对象时,有重复代码

方式三:工厂模式

* 套路:通过工厂函数动态创建对象并返回
* 使用场景:需要创建多个对象
* 问题:对象没有一个具体的类型,都是Object类型

方式四:自定义构造函数模式

* 套路:自定义构造函数,通过new创建对象
* 适用场景:需要创建多个类型确定的对象
* 问题:每个对象都有相同的数据,浪费内存

方法五:构造函数+原型组合模式

 * 套路:自定义构造函数,属性在函数中初始化,方法添加到原型上
* 适用场景:需要创建多个类型确定的对象

继承

原型类继承

1.套路
* 1.定义父类型的构造函数
* 2.给父类型的原型添加函数
* 3.定义子类型的构造函数
* 4.创建父类型的对象赋值给子类型的原型
* 5.将子类型原型的构造属性设置为子类型
* 6.给子类型原型添加方法
* 7.创建子类型的对象:可以调用父类型的方法
2.关键
1.子类型的原型为父类型的一个实例对象

借用构造函数继承

1.套路:
1.定义父类型构造函数
2.定义子类型构造函数
3.在子类型构造函数中调用父类型构造
2.关键
1.在子类型构造函数中通用call()调用父类型构造函数

组合继承

原型链+借用构造的组合继承
1.利用原型链实现对父类型对象的方法继承
2.利用构造函数借用父类型构造函数初始化相同属性

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值