underscore.js源码阅读(2)

??今天看了下underscore中的restArgs函数和createAssigner函数

123456789101112131415161718192021222324252627
//(http://ariya.ofilabs.com/2013/03/es6-and-rest-parameter.html)// This accumulates the arguments passed into an array, after a given index.// 和ES6中的rest特性相似,根据给定参数的索引位置,将参数填充到索引之后的位置上//(参见 https://github.com/jashkenas/underscore/issues/2542)  var restArgs = function(func, startIndex) {    startIndex = startIndex == null ? func.length - 1 : +startIndex;     return function() {      var length = Math.max(arguments.length - startIndex, 0),          rest = Array(length),          index = 0;      for (; index < length; index++) {        rest[index] = arguments[index + startIndex];      }      switch (startIndex) {        case 0: return func.call(this, rest);        case 1: return func.call(this, arguments[0], rest);        case 2: return func.call(this, arguments[0], arguments[1], rest);      }      var args = Array(startIndex + 1);      for (index = 0; index < startIndex; index++) {        args[index] = arguments[index];      }      args[startIndex] = rest;      return func.apply(this, args);    };  };

??createAssigner函数主要是用在下面三个地方:

123456789
 // Extend a given object with all the properties in passed-in object(s).  _.extend = createAssigner(_.allKeys);

  // Assigns a given object with all the own properties in the passed-in object(s).  // (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign)  _.extendOwn = _.assign = createAssigner(_.keys);

// Fill in a given object with default properties.  _.defaults = createAssigner(_.allKeys, true);

?? _.extend 函数是用来干扩展对象属性的函数;而 _.extendOwn 函数则只会对象自身已有属性; _.defaults 函数则是,如果 key 相同,后面的不会覆盖前面的,取第一次出现某 key 的 value,为 key-value 键值对。
??除此之外, 大专栏  underscore.js源码阅读(2)三个方法都能接受 >= 1 个参数,以 .extend 为例,.extend(a, b, c) 将会将 b,c 两个对象的键值对分别覆盖到 a 上。

123456789101112131415161718192021222324252627282930313233343536373839404142
// An internal function for creating assigner functions.// 用于实现分配器功能的内部函数  var createAssigner = function(keysFunc, defaults) {  // 返回函数    // 经典闭包(defaults 参数在返回的函数中被引用)    // 返回的函数参数个数 >= 1    // 将第二个开始的对象参数的键值对 "继承" 给第一个参数    return function(obj) {      var length = arguments.length;      // 只传入了一个参数(或者 0 个?)      // 或者传入的第一个参数是 null      if (defaults) obj = Object(obj);      if (length < 2 || obj == null) return obj;      // 枚举第一个参数除外的对象参数      // 即 arguments[1], arguments[2] ...      for (var index = 1; index < length; index++) {        var source = arguments[index],        // 提取对象参数的 keys 值        // keysFunc 参数表示 _.keys         // 或者 _.allKeys            keys = keysFunc(source),            l = keys.length;        // 遍历该对象的键值对        for (var i = 0; i < l; i++) {            var key = keys[i];            // _.extend 和 _.extendOwn 方法            // 没有传入 defaults 参数,即 !defaults 为 true            // 即肯定会执行 obj[key] = source[key]             // 后面对象的键值对直接覆盖 obj            // ==========================================            // _.defaults 方法,defaults 参数为 true            // 即 !defaults 为 false            // 那么当且仅当 obj[key] 为 undefined 时才覆盖            // 即如果有相同的 key 值,取最早出现的 value 值            // _.defaults 中有相同 key 的也是一样取首次出现的            if (!defaults || obj[key] === void 0) obj[key] = source[key];        }      }      // 返回已经继承后面对象参数属性的第一个参数对象      return obj;    };  };

原文地址:https://www.cnblogs.com/dajunjun/p/11711028.html

时间: 2024-10-31 01:18:07

underscore.js源码阅读(2)的相关文章

underscore.js源码解析

一直想针对一个框架的源码好好的学习一下编程思想和技巧,提高一下自己的水平,但是看过一些框架的源码,都感觉看的莫名其妙,看不太懂,最后找到这个underscore.js由于这个比较简短,一千多行,而且读起来容易一些,所以就决定是它了,那废话不多说开始我们的源码学习. underscore.js源码GitHub地址: https://github.com/jashkenas/underscore/blob/master/underscore.js 本文解析的underscore.js版本是1.8.3

underscore.js源码解析(二)

前几天我对underscore.js的整体结构做了分析,今天我将针对underscore封装的方法进行具体的分析,代码的一些解释都写在了注释里,那么废话不多说进入今天的正文. 没看过上一篇的可以猛戳这里:underscore.js源码解析(一) underscore.js源码GitHub地址: https://github.com/jashkenas/underscore/blob/master/underscore.js 本文解析的underscore.js版本是1.8.3 _.each 1

underscore.js源码研究(8)

概述 很早就想研究underscore源码了,虽然underscore.js这个库有些过时了,但是我还是想学习一下库的架构,函数式编程以及常用方法的编写这些方面的内容,又恰好没什么其它要研究的了,所以就了结研究underscore源码这一心愿吧. underscore.js源码研究(1) underscore.js源码研究(2) underscore.js源码研究(3) underscore.js源码研究(4) underscore.js源码研究(5) underscore.js源码研究(6)

Dom7.js 源码阅读备份

在Framework7,其特色的HTML框架,可以创建精美的iOS应用;  她有自己的 DOM7- 一个集成了大部分常用DOM操作的高性能库.你不需要学习任何新的东西,因为她的用法和大名鼎鼎的jQuery几乎是一样的,包括大部分常用的方法和jquery风格的链式调用.去查看了一下dom7.js的源码,发现非常适合学习: 源码如下: /*=========================== Dom7 Library ===========================*/ var Dom7 =

underscore.js 源码分析5 基础函数和each函数的使用

isArrayLike 检测是数组对象还是纯数组 var property = function(key) { return function(obj) { return obj == null ? void 0 : obj[key]; }; }; var getLength = property('length'); var isArrayLike = function(collection) { var length = getLength(collection); return typeo

flipsnap.js 源码阅读笔记

这是官网:http://hokaccha.github.io/js-flipsnap/ 1.引入全局命名空间 类似jQuery插件写法   传入window, document,提高内部访问速度: ;(function(window, document, undefined){})(window, window.document)   2.定义全局变量 /* 新建div节点 */ var div = document.createElement('div'); /* 浏览器前缀 */ var p

underscore.js源码解析【集合部分】

// Collection Functions // -------------------- // The cornerstone, an `each` implementation, aka `forEach`. // Handles raw objects in addition to array-likes. Treats all // sparse array-likes as if they were dense. /* params: 数组.对象或类数组对象,函数,函数执行环境 *

underscore.js源码解析【函数】

// Function (ahem) Functions // ------------------ // Determines whether to execute a function as a constructor // or a normal function with the provided arguments. /* 判断一个函数是按照构造函数还是普通函数执行?????????????????????????????????????????????????????????? */

underscore.js源码解析【对象】

// Object Functions // ---------------- // Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed. /* ie9以下版本中,对象中的key是不能被遍历的 */ var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString'); var nonEnumerableProps = ['valueO