lodash內部方法getData和setData實例解析

getData

getData方法主要是獲取方法的元數據metadata。

getData實現上借助metaMap和noop兩個內部方法。

metaMap

metaMap方法獲取當前環境下的WeakMap對象。

import WeakMap from './_WeakMap.js';
var metaMap = WeakMap && new WeakMap;

WeakMap

getNative方法和root變量在之前的篇章介紹過,主要是獲取環境變量和全局方法。

源碼如下:

import getNative from './_getNative.js';
import root from './_root.js';
var WeakMap = getNative(root, 'WeakMap');

noop

noop主要是獲取undefined的返回結果。

源碼如下:

function noop() {}

getData源碼實現

import metaMap from './_metaMap.js';
import noop from './noop.js';
var getData = !metaMap ? noop : function(func) {
  return metaMap.get(func);
};

setData

setData方法可以設置參數func的元數據。

參數說明:

  • 參數1:表示要關聯元數據的函數
  • 參數2:表示對元數據進行數據處理。

setData實現上需要借助兩個內部方法,分別是:baseSetData和shortOut。

baseSetData

baseSetData是setData的基本實現,通過Map對象存儲函數與數據的映射關系。

實現上借助identity方法和metaMap方法,identity方法在之前篇章中介紹過,主要是代表函數一種調用關系,該方法返回參數。metaMap方法主要是調用Map對象,這個方法在上面getData裡已經介紹過瞭。

import identity from './identity.js';
import metaMap from './_metaMap.js';
var baseSetData = !metaMap ? identity : function(func, data) {
  metaMap.set(func, data);
  return func;
};

metaMap

shortOut

shortOut方法用於按照毫秒范圍內的調用數檢測熱函數,可以創建一個函數,該函數將縮短並調用identity方法。

實現上通過閉包計數,隻有滿足調用的時間差小於HOT_SPAN時才會進入後續判斷,否則count初始化為0,並且直接返回原函數以及參數關系等。

在後續處理中隻有count滿足大於等於HOT_COUNT時直接返回arguments[0]。

源碼如下:

var HOT_COUNT = 800,
    HOT_SPAN = 16;
function shortOut(func) {
  var count = 0,
      lastCalled = 0;
  return function() {
    var stamp = nativeNow(),
        remaining = HOT_SPAN - (stamp - lastCalled);
    lastCalled = stamp;
    if (remaining > 0) {
      if (++count >= HOT_COUNT) {
        return arguments[0];
      }
    } else {
      count = 0;
    }
    return func.apply(undefined, arguments);
  };
}

setData源碼實現

import baseSetData from './_baseSetData.js';
import shortOut from './_shortOut.js';
var setData = shortOut(baseSetData);

小結

本篇章我們瞭解到getData和setData方法實現,主要是通過Map對象對參數設置元數據,同時我們也瞭解到內部其他方法metaMap、noop、shortOut等方法的實現,更多關於lodash方法getData setData的資料請關註WalkonNet其它相關文章!

推薦閱讀: