8-3 MVC(类优化、类继承)

  • 引入类
    class
  • 引入继承
    class继承class
  • 路由

MVC

1.对象m

  • 对象m中的内容
    1.data:存数据
    2.增删改查函数:暂时只用到改

2.对象v

  • 内容
    1.el
    2.html
    3.init():初始化函数调用
    4.render():渲染

3.对象C

  • init()
  • events:事件一一映射哈希表
  • autoBindEvent:事件绑定
  • 一对方法:add、minus、mul等

抽象一:使用类抽象代码

  • 对于app1和app2中的对象m,都存在属性data和属性增删改查
    两个app中的对象v和对象c中都存在相同的属性
  • 问:为什么不把相同的属性抽成公共属性?
    公共属性:原型
  • 抽象思维:
    同样的属性写三遍,就应该做成共用属性(原型或类)

1.抽象M

  • 先判断两个app中的对象m中,哪些属性是独有的,哪些是共有的
    增删改查是共有的
    data是不共有的(数据不同)
  • 使用类的思想进行抽象
    1.共有属性直接写进去
    2.不共有的属性需要初始化的时候传给我:constructor(options)
    会将它在创建对象的时候放到对象上
  • 新建目录base:基础代码
    1.新建文件Model.js(所有类都是首字母大写)
    2.文件里添加类Model,不需要逗号和内容
    3.也就是所有的Model都有增删改查四个属性,不需要给内容,只需要知道有这个属性就行
  • Model的类构造好了,传入的对象options则是有需要的内容决定
    1.需要data,传入data
    2.需要updata:可以直接调用覆盖(m.updata = ()=>{函数式});或者直接一起放到options上面自定义传入覆盖(调用函数时先看m自身属性再看原型上的)
class Model{
  constructor(options){
  //只要用户创建的时候传入对象,就会把对象上的属性放到这个创建对象的属性上
  //是放在当前创建对象本身身上
   ['data','update','create','delete','get'].forEach((key)=>{
     if(key in options){
       this[key] = options[key]
     }
  })
  }
  //下面这些都是在原型链上的__proto__
  creat(){}
  delete(){}
  update(){}
  get(){}
}
  • 创建之后,只要声明
    const m = new Model(options)
    则对象m就可以使用Model中的属性和options上的属性
  • 导出:export default Model
  • 在app1.js中引入:import Model from './base/Model.js'
  • 创建举例:
    对象m中具有data属性和update
const m = new Model({
  data:{n: value}
  update: function(date){
    函数式
  }
})

2.简化V

  • base中创建view.js
  • 同样创建class View

3.合并VC

  • vue.js认为:作为前端的库,核心应该是视图View
  • 因此合并对象V和C后,应该还是叫V
  • 修改View的class

2.if语句升级

  • 基本语句:如果JS中console和console.error存在,则执行
if(console && console.error){
   console.error('你还没有实现 create')
}
  • 升级
console && console.error && console.error('你还没有实现 create')
  • 升级二:?.语法(也叫:可选链语法)
    注意:这个语法太新了,有些编辑器可能不支持
console?.error?.('你还没有实现 create')

继承EventBus

  • 创建EventBus的类
  • 偷梁换柱:实际上还是用的jQuery的EventBus,但封装起来看起来像自己写的
import $ from 'jquery'
class EventBus{
  constructor(){
    this._EventBus = $(window)//这是真正的EventBus
  }
  on(eventName,fn){
    return this._eventBus.on(eventName,fn)
  }
  trigger(){}
  off(){}
}

export default EventBus

const e = new EventBus()
e.on()
e.trigger()
e.off()
  • 这样写看起来麻烦了(以前直接定义对象,现在还要封装一次再引入),但有好处
  • 优点:
    1.可以随时改变EventBus的实现
    2.现在EventBus是用jQuery实现的,如果有一天不用jQuery了,直接把模块中的jQuery删掉就可以了
    3.用了虚拟DOM就不需要jQuery了
  • EventBus实现了底层和上层的链接
    底层需要依赖jQuery,但现在在底层和中间层之间多了EventBus,相当于底层是依赖于EventBus,而EventBus依赖于jQuery
    现在要修改jQuery,只需要修改中间层的依赖即可,不会动摇底部跟你
    在这里插入图片描述
  • 但多了一层想要on和trigger的调用的时候也多了一层
    由View和Model构造的对象:this.eventBus.on
  • 那么如果想要跳过EventBus直接调用呢?
    答:使用继承
    View和Model是类、EventBus也是类,让View和Model都继承EventBus
    在这里插入图片描述
  • 实现
import EventBus from './EventBus'
class Model extends EventBus{
  constructor(options){
    super() //初始化EventBus,EventBus#constructor
    其他Model代码
  }
}
  • 这样EventBus就是Model的一层原型,父级类,可以直接调用on了
  • 注意:JS代码不能以括号开头
    因为括号开头的JS总会去上一层找能不能结合起来
fn()//函数调用
[0,1,2].forEach()//数组遍历

//结合成
fn()[0,1,2].forEach()
  • 解决:
    1.要么每句话加分号(不推荐!!!很麻烦!!!)
    2.要么不用括号开头,直接声明一个中间变量 arr
fn()
const arr = [0,1,2]
arr.forEach()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值