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等内部方法的实现,更多关于lodash内部方法的资料请关注脚本之家其它相关文章!

你可能感兴趣的:(lodash内部方法getFuncName及setToString剖析详解)