image.png

链式调用

函数调用返回的是个实例,然后接着调用

关注点在于对象流通

Stream流式编程

(function(root){
      var _ = function (){
      if(!(this instanceof _)){
        return new _(data) // 语法糖
      }
      this.wrapper = data
    }
       _.unique = function(source, callback){
       var ref = []
       for(let i = 0; i< source.length; i++){
         var target = callback ? callback[source[i]]:source[i]
         if(ref.indexOf(target) == -1){
            ref.push(target)
            }
           )
       }
    }
      _.prototype.ending = funciton(){
      return this.wrapper
    }
      _.filters = function(source){
      return source
    }
      _.chain = function(source){
      var ins = _(source)
      ins._chain = true
    }
      _.model = function(instance,outcome){
      if(instance._chain){
        instance.wrapper = outcome
        return instance
      }
      return outcome
    }
      _.prossess = function(target){
      var res = []
      for(var key in target){
        res.push(key)
      }
      return res
    }
      _.beforHook = function(arr, callback){
      for(let i = 0; i< arr.length; i++){
        callback(arr[i])
      }
    }
      // 混入 方法的名称 存储在数组中 遍历数组 给原型扩展item
      _.mixin = function(target){
      //方法的名称 存储在数组中
      beforHook(_.prossess(target), function(key){
        var func = target[key]
        _.prototype[key] = function(){
             var decon = [this.wrapper]
          Array.prototype.push.apply(decon, arguments)
          return func.apply(this, decon)
        }
      })
    }
      root._ = _
})(this)
_([]).unique(function(item){
  return typeof item === 'string' ?item.toLowerCase() : item
})

1.1. 可扩展性

1.1.1. 1-22 方法层面

可扩展性的目的:需求变更,方便更改需求;减少代码修改饿难度

好的可扩展性:

  1. 需求的变更不要重写

  2. 代码修改不会引起大规模变动

  3. 方便加入新模块

适配器模式

与其我更改源头,不如我去适配

通过写一个适配器,来代替替换

面临接口名不通用的问题

例子:现在想要用log代替console.log方法

例子:框架的变更

自研的A框架,A框架和jquery很相似,现在要用jquery代替A框架

window.A = $
A.c = function(){
  return $.css.call(this, arg)
}

例子:数据适配,参数适配

装饰者模式

给原方法扩展一些操作,并包装为新方法

不重写源方法的情况下去扩展方法

当一个方法需要扩展,但是不好去修改方法

重写一个新方法,加入老操作,写入新操作

例子:扩展已有事件绑定

例子:vue2数组的监听

命令模式

解藕方法和调用

解藕实现和调用,让双方互不干扰

调用的命令充满不确定性

// 命令
{
    type: "Circle",
    data: [10,12,2]
},
  {
        type: "tec",
      data" [2,3,5]
  }
var command = (function(){
  // 实现
    var action = {
    drawCircle: function (){}
    ,drawRect: function (){}
  }
  // 命令解析 => 调用实现的方法
  return function excute(commander){
    // 在这里解析commander命令
    // 然后去调用action里的方法
  } 
})
conmmand({
    type: "Circle",
  data: [10,12,2]
})

1.1.2. 1-23 模块层面

观察者模式

同步模块与异步模块的沟通

解藕 在中间加入观察者中间件

必要结构

框架

例子:多人合作问题

A写了首页模块,B写了评论模块,现在要把评论展示在首页 => 通过观察者模式联系起来

function observe(){
  // 储存观察
    message: {}
  // 注册监听
  regist: function (type,fn){

  }
  // 触发监听
  fire: function (){

  }
  // 移除监听
  remove: function (){

  }
}

obj.regist("getComment",(data)=>{

})
obj.fire("")

转盘:每转一圈速度都会减慢

/**
// 梳理要做什么
* 开始转动
* 选定奖品
* 展示转动动画
* 每转一圈
* 下一圈慢一点
*/
// 转盘初始化模块
// 选定奖品模块
// 转动控制模块
// 转动动画

// 转动控制 与 转动动画 之间使用观察者沟通

function init(){
  for(let i = 0; i <= 9;i++){
        var _dir = document.create('div')
    _div.innerHTML = i
    _div.setAttributeNS("class","item")
    _domArr.push(_div)
  }
}
function getFinnal(){

}
function moveControll(){
  let final = getFinnal()
  var _cricle = Math.floor(final /10,0)
  let _runCircle = 0
  let stopNum = final %10
  let _speed = 50
  mover({
      moveTime: _moveTime,
      speed: _speed
    })
  observer.regist("finish",()=>{
    let _moveTime = 10
    _speed += 50
    _runCircle++
    if(_runCircle > _circle){
      _moveTime = stopNum
    }
    mover({
      moveTime: _moveTime,
      speed: _speed
    })
  })
}
function mover(moveConfig){
  let nowIndex = 0
  let removeNum = 9
  let timer = setInterval(()=>{
    if(nowINdex != 0){
      removeNum = nowINdex - 1
            _domArr[9].setAttribute("calss","item")
      _domArr[0].setAttribute("calss","item-on"
    }

     if(nowIndex == moveConfig.moveTime){
                clearInterval(timer)
        onserver.fire("fire")
      }

  },moveConfig.speed)
}

职责链模式

把模块组织成一个链条,搞成流水线

分好模块,按序执行

目的:为了避免请求发送者与多个请求处理者耦合

场景:当你面对一个半成品需求

例子:表单验证

有一个表单要验证

可能出现:验证身份证号

当前:验证格式符不符合规则,是否已经存在

做法:把要做的事情组织成一个队列

input.onblur = function (){
  var _arr = [font, back]
  async function test(){
      var _res = _val
    while(_arr.length > 0){
      _res = await _arr.shift()(_res)
      if(_res.error){
                return _res
      }
    }
    return _res

}}

例子:

Axios的拦截器

axios.interceptor.request.use()
axios.interceptor.response.use()
function axios(){
  this.intercetor = {
    request: new INterceptorManner(),
    response: new INterceptorManner()
  }
}
axios.prototype.request = function (){
  let chain = []
  this.interceptor.request.handlers.forEach(interceptor) => {
    chain.unshift(interceptor.fullfilled, interceptor.rejected)
  }
  this.interceptor.response.handlers.forEach(interceptor) => {
    chain.unshift(interceptor.fullfilled, interceptor.rejected)
  }
  while(chain.length){
    promise = promise.then(chain.shift(),chain.shift())
  }
}
function interceptorManner(){
    this.handlers = []
}
inter.prototype.use = function (fullfilled,rejected){
  this.handlers.push({
    fullfilled,
    rejected,
  })
}

1.2. 1-28 复习课

1.2.1. 函数式编程

image-20220128200332866

1.2.2. 异步编程

image-20220128201342014

1.3. 3-13

(卸载文档unload) =》 DNS解析 =〉 准备发起http连接 =》 TCP建立连接 =》 IP协议分包 =〉 发送请求 =》 然后回传

© Jasonk0 all right reserved,powered by Gitbook该文件修订时间: 2022-07-21 08:53:32

results matching ""

    No results matching ""