through2 本质上是一种transform的流
被封装更好地操作流
var Transform = require('readable-stream/transform'), inherits  = require('util').inherits, xtend     = require('xtend')function DestroyableTransform(opts) {// 继承TransformTransform.call(this, opts)this._destroyed = false
}inherits(DestroyableTransform, Transform)
// 原型接口destory 用来关闭流
DestroyableTransform.prototype.destroy = function(err) {if (this._destroyed) returnthis._destroyed = truevar self = thisprocess.nextTick(function() {if (err)self.emit('error', err)self.emit('close')//events的使用})
}// a noop _transform function
// 空操作
function noop (chunk, enc, callback) {callback(null, chunk)
}// create a new export function, used by both the main export and
// the .ctor export, contains common logic for dealing with arguments
// 返回一个导出的函数接口
function through2 (construct) {
// 返回使用的匿名函数return function (options, transform, flush) {if (typeof options == 'function') {flush     = transformtransform = optionsoptions   = {}}// 这种匿名函数我们一般可以用来做二次判断触发if (typeof transform != 'function')transform = noopif (typeof flush != 'function')flush = nullreturn construct(options, transform, flush)}
}// main export, just make me a transform stream!
// 主要出口,使用through2返回一个DestroyTransform实例
module.exports = through2(function (options, transform, flush) {var t2 = new DestroyableTransform(options)t2._transform = transformif (flush)t2._flush = flushreturn t2
})// make me a reusable prototype that I can `new`, or implicitly `new`
// with a constructor call
// 对外暴露一个可以直接 new (或者不加 new)来创建实例的的构造函数
module.exports.ctor = through2(function (options, transform, flush) {function Through2 (override) {if (!(this instanceof Through2))// 这里就是直接自动newreturn new Through2(override)this.options = xtend(options, override)// 添加配置DestroyableTransform.call(this, this.options)}inherits(Through2, DestroyableTransform)Through2.prototype._transform = transformif (flush)Through2.prototype._flush = flushreturn Through2
})// Object模式的简单封装
module.exports.obj = through2(function (options, transform, flush) {var t2 = new DestroyableTransform(xtend({ objectMode: true, highWaterMark: 16 }, options))t2._transform = transformif (flush)t2._flush = flushreturn t2
})
xtend lib //简单的继承 两种,一种可变  一种不可变
module.exports = extendvar hasOwnProperty = Object.prototype.hasOwnProperty;
// 缓存老套路。优化性能
function extend(target) {// 这里有个有意思的地方。target第一个拿进来。在多个参数的情况下。下面从arguments[1]开始取,而下面可以直接使用target,而不用再声明一下变量for (var i = 1; i < arguments.length//这块其实可以缓存长度的; i++) {var source = arguments[i]for (var key in source) {if (hasOwnProperty.call(source, key)) {// 判断当前实例是否存在属性// 有则添加到target上。无则跳过,支持覆盖target[key] = source[key]}}}return target
}不可变。
module.exports = extendvar hasOwnProperty = Object.prototype.hasOwnProperty;function extend() {
// 与原先不同的是,这里使用了一份初始化的对象引用来作为容器承载
// 其余没有不同var target = {}for (var i = 0; i < arguments.length; i++) {var source = arguments[i]for (var key in source) {if (hasOwnProperty.call(source, key)) {target[key] = source[key]}}}return target
}

  • throught
  • xtend

through2.js,xtend.js源码相关推荐

  1. chosen.jquery.js 、chosen-select 源码修改控制 chosen:updated 方法动态更新下拉框选项不更新搜索框值 ,chosen 实现远程搜索加载下拉选项

    chosen.jquery.js .chosen-select 源码修改控制 chosen:updated 方法动态更新下拉框选项不更新搜索框值,chosen 实现远程搜索加载下拉选项 chosen. ...

  2. 100行JS代码实现❤坦克大战js小游戏源码 HTML5坦克大战游戏代码(HTML+CSS+JavaScript )

    坦克大战js小游戏源码 HTML5坦克大战游戏代码(HTML+CSS+JavaScript ) HTML5坦克大战网页小游戏,完美还原小霸王学习机效果,以坦克战斗及保卫基地为主题,属于策略型类游戏. ...

  3. [Vue.js进阶]从源码角度剖析vue-router(三)

    前言 在上篇中主要叙述了 vue-router 中生成 $route 对象的时机,路由懒加载的原理,以及异步路由之前执行的一系列路由守卫 在本篇中会讲述: 异步路由解析成功后执行的一系列路由守卫 vu ...

  4. KRPano JS 场景编辑器源码

    KRPano JS编辑器,可以运行在Node环境中. 源码地址:https://github.com/xxweimei/krpano-editor-js 或者下载zip包:http://pan.bai ...

  5. 深入理解 Node.js 中 EventEmitter源码分析(3.0.0版本)

    events模块对外提供了一个 EventEmitter 对象,即:events.EventEmitter. EventEmitter 是NodeJS的核心模块events中的类,用于对NodeJS中 ...

  6. 关于鸿蒙系统 JS UI 框架源码的分析

    鸿蒙是华为研发的新一代终端操作系统,能适用于 IoT.手表.手机.Pad.电视等各种类型的设备上,扛起"国产操作系统"的大旗,也遭受了很多非议.2021 年 6 月初发布了 Ope ...

  7. commander.js使用及源码分析

    commander.js commander是一个轻巧的nodejs模块,提供了用户命令行输入和参数解析强大功能. commander的特性: 自记录代码 自动生成帮助 合并短参数 默认选项 强制选项 ...

  8. ramda.js的compose源码解析

    前言 上一篇文章介绍了javascript中的compose函数的实现,我是用了递归的思想去让函数依次执行,lodash中是用了迭代的思想依次执行函数,但实现了以后我还是觉得有些别扭,仔细想想,我们实 ...

  9. 一个事件订阅和发布的库(onfire.js)的源码浅析

    文章目录 一.onfire.js介绍 二.API介绍 三.变量浅析 四.订阅函数浅析 五.发布函数浅析 六.全部源码 一.onfire.js介绍 一个简单实用的事件订阅和发布的库. onfire.js ...

  10. 迷你 JS 框架 Hyperapp 源码解析

    Hyperapp 是最近热度颇高的一款迷你 JS 框架,其源码不到 400 行,压缩 gzip 后只有 1kB,却具有相当高的完成度,拿来实现简单的 web 应用也不在话下.整体实现上,Hyperap ...

最新文章

  1. Java基础--二维数组
  2. flex 会使div撑满_如何讲清楚Flex弹性盒模型?(中)
  3. Linux 下C++编写
  4. 详解 Visual C# 数据库编程
  5. Objective-C学习笔记-使用NSString与NSData读写文件
  6. android api接口文档,API 接口文档
  7. Docker在linux下的安装
  8. 原生JS封装运动框架。
  9. centos 升级 glibc和glibcxxx ,解决error: Failed dependencies等问题
  10. 通通玩blend美工(1)——荧光Button
  11. SQL Server常用数据类型
  12. ArcGIS软件气象数据插值教程
  13. 安装VS2003 2005错误
  14. openresty性能调优
  15. Kylin 之Cube 构建优化
  16. 群晖服务器创建文件夹,群晖Synology 创建共享文件夹视频图文教程
  17. 西游记中牛魔王的雄厚实力和家业地盘
  18. 优化函数 (Optimization Function)
  19. 可持续时尚分论坛精彩回顾 | 第二届始祖数字化可持续发展峰会
  20. Android Camera之Deferred Surface

热门文章

  1. 015. P2P技术详解(一):NAT详解——详细原理、P2P简介
  2. 怎么恢复永久删除的文件
  3. Python零基础入门基础教程(非常详细)版
  4. 二维码识别(zxing)java实现(差强人意的实现)
  5. HOW UNREAL RENDERS A FRAME
  6. JS实现延时3秒刷新
  7. 【机器学习-斯坦福】学习笔记1 - 机器学习的动机与应用
  8. 华为手机打开图片很慢是怎么回事_华为手机打开应用很慢怎么办
  9. laragon 更换php的版本
  10. 项目总结--3(@Cacheable的使用方法和使用技巧)