当前位置 : 主页 > 网络编程 > JavaScript >

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

来源:互联网 收集:自由互联 发布时间:2023-02-08
目录 getFuncName realNames setToString baseSetToString constant defineProperty identity shortOut 小结 getFuncName getFuncName方法主要是获取参数 func 的name属性。 实现上主要通过函数的name属性去获取,同时也兼
目录
  • getFuncName
    • realNames
  • setToString
    • baseSetToString
      • constant
      • defineProperty
      • identity
    • shortOut
    • 小结

      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内部方法的资料请关注易盾网络其它相关文章!

      网友评论