首頁 > 軟體

lodash內部方法getFuncName及setToString剖析詳解

2022-09-02 18:02:53

getFuncName

getFuncName方法主要是獲取引數func的name屬性。

實現上主要通過函數的name屬性去獲取,同時也相容原型鏈上屬性判斷。

原始碼如下:

import realNames from './_realNames.js';
var objectProto = Object.prototype;
var hasOwnProperty = objectProto.hasOwnProperty;
function getFuncName(func) {
  var result = (func.name + ''),
      array = realNames[result],
      length = hasOwnProperty.call(realNames, result) ? array.length : 0;
  while (length--) {
    var data = array[length],
        otherFunc = data.func;
    if (otherFunc == null || otherFunc == func) {
      return data.name;
    }
  }
  return result;
}

realNames

realNames方法原始碼實現是賦值一個空物件,方便後續參照和儲存。

原始碼如下:

var realNames = {};

setToString

setToString方法主要是將引數“func”的“toString”方法設定為返回“string”。

該方法返回一個函數。

引數說明:

  • 引數1:func要修改的函數。
  • 引數2:字串“toString”結果。

setToString方法在實現上藉助了baseSetToString內部方法和shortOut內部方法。

原始碼如下:

import baseSetToString from './_baseSetToString.js';
import shortOut from './_shortOut.js';
var setToString = shortOut(baseSetToString);

baseSetToString

import constant from './constant.js';
import defineProperty from './_defineProperty.js';
import identity from './identity.js';
var baseSetToString = !defineProperty ? identity : function(func, string) {
  return defineProperty(func, 'toString', {
    'configurable': true,
    'enumerable': false,
    'value': constant(string),
    'writable': true
  });
};

constant

constant方法是lodash對外匯出的方法,該方法可以建立一個返回引數value的函數,返回的是新的常數函數。

使用如下:

var objects = _.times(2, _.constant({ 'a': 1 }));
console.log(objects);
// => [{ 'a': 1 }, { 'a': 1 }]
console.log(objects[0] === objects[1]);
// => true

原始碼如下:

function constant(value) {
  return function() {
    return value;
  };
}

defineProperty

defineProperty方法通過getNative獲取原生的Object.defineProperty方法。

原始碼如下:

import getNative from './_getNative.js';
var defineProperty = (function() {
  try {
    var func = getNative(Object, 'defineProperty');
    func({}, '', {});
    return func;
  } catch (e) {}
}());

identity

identity方法在之前的方法的篇章中介紹過,主要是返回引數本身,方便在迭代中的函數呼叫,是一種傳參形式。

原始碼如下:

function identity(value) {
  return value;
}

shortOut

在《 lodash裡內部方法getData和setData的實現 》中我們瞭解到shortOut方法的實現。

小結

本篇章我們簡單瞭解了lodash裡的兩個內部方法getFuncName和setToString的實現,同時我們也在瞭解實現的過程中認識到了constant、defineProperty等內部方法的實現,更多關於lodash內部方法的資料請關注it145.com其它相關文章!


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