lodash里的内部方法getFuncName和setToString

596 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第32天,点击查看活动详情

前言

本篇章我们主要是通过了解lodash里的两个内部方法getFuncName方法和setToString方法,在实际开发中我们也可以借鉴方法的实现思路,在需要的时候简单封装一下。

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等内部方法的实现。