lodash内部方法getFuncName及setToString剖析详解

2022-09-03 14:13:51
目录
getFuncNamerealNamessetToStringbaseSetToStringconstantdefinePropertyidentityshortOut小结

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里的两个内部方法getFuncName和setToString的实现,同时我们也在了解实现的过程中认识到了constant、defineProperty等内部方法的实现,更多关于lodash内部方法的资料请关注易采站长站其它相关文章!