首頁 > 軟體

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

2022-08-30 22:00:34

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的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com