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内部方法的资料请关注阿兔在线工具其它相关文章!