手寫代碼

Function.prototype.mycall = function(context, ...args) {
    context = context ? new Object(context) : window
    let key = Symbol()
    context[key] = this
    context[key](...args)
    delete context[key]
  }

  Function.prototype.myapply = function(context) {
    context = context || window
    let key = Symbol()
    let args = arguments[1]
    context[key] = this
    let result
    if (args) {
      result = context[key](...args)
    } else {
      result = context[key]()
    }
    delete context[key]
  }

  Function.prototype.mybind = function(context) {
    const self = this
    let args = arguments.slice(1)
    const bindFn = function() {
      return self.apply(
        this instanceof bindFn ? this : context,
        ...args,
        ...arguments
      )
    }

    bindFn.prototype = Object.create(self.prototype)

    return bindFn
  }

  // 模擬new
  const createNew = (Con, ...args) => {
    const obj = Object.create(Con.prototype)
    // Object.setPrototypeOf(obj, Con.prototype)
    let result = Con.apply(obj, args)
    return result instanceof Object ? result : obj
  }

  //模擬instance
  const myInstanceOf = (left, right) => {
    let leftValue = left.__proto__
    let rightValue = right.prototype
    while (true) {
      if (leftValue === null) return false
      if (leftValue === rightValue) return true
      leftValue = leftValue.__proto__
    }
  }

  //深拷貝
  const deepClone = (target, cache = new WeakMap()) => {
    if (target === null || typeof target !== 'object') {
      return target
    }
    if (cache.get(target)) {
      return target
    }
    const copy = Array.isArray(target) ? [] : {}
    cache.set(target, copy)
    Object.keys(target).forEach(
      key => (copy[key] = deepClone(target[key], cache))
    )
    return copy
  }

  //防抖
  const debounce = (fn, wait = 300, leading = true) => {
    let timerId, result
    return function(...args) {
      timerId && clearTimeout(timerId)
      if (leading) {
        if (!timerId) {
          result = fn.apply(this, args)
          timerId = setTimeout(() => {
            timerId = null
          }, wait)
        }
      } else {
        timerId = setTimeout(() => {
          result = fn.apply(this, args)
          timerId = null
        }, wait)
      }
      return result
    }
  }

  //節(jié)流-定時器
  const throttle = (fn, wait = 300) => {
    let timerId
    return function(...args) {
      if (timerId) {
        setTimeout(() => {
          return fn.apply(this, args)
          timerId = null
        }, wait)
      }
    }
  }

  //節(jié)流-時間戳
  const throttleByTimer = (fn, wait = 300) => {
    let prev = 0
    return function(...args) {
      let now = +new date()
      if (now - prev > wait) {
        prev = now
        return fn.apply(this, args)
      }
    }
  }

  //數組去重
  const uniqBy = (arr, key) => {
    return [...new Map(arr.map(item => [item[key], item])).values()]
  }

  //數組扁平化-技巧版
  const flatten = arr =>
    arr
      .toString()
      .split(',')
      .map(item => +item)

  //數組扁平化
  const flatten2 = (arr = [], deep = 1) => {
    return arr.reduce((cur, next) => {
      return Array.isArray(next) && deep > 1
        ? [...cur, ...flatten2(next, deep - 1)]
        : [...cur, next]
    }, [])
  }

  //函數柯里化
  const currying = fn =>
    (_curry = (...args) =>
      args.length >= fn.length
        ? fn(...args)
        : (...newArgs) => _curry(...args, ...newArgs))

  //發(fā)布訂閱
  class EventEmitter {
    subs = {}
    emit(event, ...args) {
      if (this.subs[event] && this.subs[event].length) {
        this.subs[event].forEach(cb => cb(...args))
      }
    }
    on(event, cb) {
      ;(this.subs[event] || (this.subs[event] = [])).push(cb)
    }
    off(event, offCb) {
      if (offCb) {
        if (this.subs[event] && this.subs[event].length)
          this.subs[event] = this.subs[event].filter(cb => cb !== offCb)
      } else {
        this.subs[event] = []
      }
    }
  }
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末蛋济,一起剝皮案震驚了整個濱河市陨晶,隨后出現的幾起案子纱皆,更是在濱河造成了極大的恐慌鹿响,老刑警劉巖绪妹,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件悬嗓,死亡現場離奇詭異顾稀,居然都是意外死亡博肋,警方通過查閱死者的電腦和手機汪厨,發(fā)現死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進店門赃春,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人骄崩,你說我怎么就攤上這事聘鳞”「ǎ” “怎么了要拂?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵抠璃,是天一觀的道長。 經常有香客問我脱惰,道長搏嗡,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任拉一,我火速辦了婚禮采盒,結果婚禮上,老公的妹妹穿的比我還像新娘蔚润。我一直安慰自己磅氨,他們只是感情好,可當我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布嫡纠。 她就那樣靜靜地躺著烦租,像睡著了一般。 火紅的嫁衣襯著肌膚如雪除盏。 梳的紋絲不亂的頭發(fā)上叉橱,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天,我揣著相機與錄音者蠕,去河邊找鬼窃祝。 笑死,一個胖子當著我的面吹牛踱侣,可吹牛的內容都是我干的粪小。 我是一名探鬼主播,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼抡句,長吁一口氣:“原來是場噩夢啊……” “哼糕再!你這毒婦竟也來了?” 一聲冷哼從身側響起玉转,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤突想,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后究抓,有當地人在樹林里發(fā)現了一具尸體猾担,經...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年刺下,在試婚紗的時候發(fā)現自己被綠了绑嘹。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡橘茉,死狀恐怖工腋,靈堂內的尸體忽然破棺而出姨丈,到底是詐尸還是另有隱情,我是刑警寧澤擅腰,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布蟋恬,位于F島的核電站,受9級特大地震影響趁冈,放射性物質發(fā)生泄漏歼争。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一渗勘、第九天 我趴在偏房一處隱蔽的房頂上張望沐绒。 院中可真熱鬧,春花似錦旺坠、人聲如沸乔遮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蹋肮。三九已至,卻和暖如春蝉衣,著一層夾襖步出監(jiān)牢的瞬間括尸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工病毡, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留濒翻,地道東北人。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓啦膜,卻偏偏與公主長得像有送,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子僧家,可洞房花燭夜當晚...
    茶點故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內容