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. 特斯拉又被挖墙脚:Autopilot总监离职,加入苹果造车团队
  2. opencv3异常 库找不到 no such file
  3. 利用返回引用来操作结构体
  4. fft函数图像横坐标是什么_10分钟学会:函数图像的平移与伸缩变换
  5. Android 中的Json解析工具fastjson 、序列化、反序列化
  6. 探讨浏览器CSS选择器的权重!!!
  7. macos上的硬盘检测工具_如何在MacOS上使用双镜头面部检测器(DSFD)实现90%以上的精度
  8. Win2008配置终端服务网络负载平衡实战 -2
  9. SpringMVC ------使用POJO对象绑定请求参数值
  10. 简易JTAG烧写程序的执行逻辑和流程
  11. linux打开九针串口,RS232 9针串口定义
  12. PDCN循环 与 GTD时间管理
  13. 《控制论导论》读书:机构-黑箱
  14. 通达oa考勤可以代打吗_OA让考勤更方便
  15. 简单快速的运行 Zheng 平台(配置篇)
  16. 英语学习逆向法 (钟道隆 著)
  17. 右手坐标系下球面参数方程的推导
  18. CDH-TXKT-集群的维护
  19. 电大考试计算机应用基础考试试题,电大计算机应用基础网络教育统考考试(2013真题卷)...
  20. oracle语句怎么查工作日,SQL查询工作日 - Oracle开发 - ITPUB论坛-中国专业的IT技术社区...

热门文章

  1. 利用python爬取贝壳网租房信息
  2. RTMP流媒体直播资料
  3. php上传公众号临时素材-微信开发素材管理6
  4. php开发公众号素材管理总结
  5. 【微信小程序】文章点赞功能的实现
  6. html加载完成 产生动作,页面加载功能设计总结
  7. 鸿蒙OS内核分析|解读鸿蒙源码
  8. VLDB 历年最佳论文汇总
  9. 一次性听懂英语影视节目的真实经历和经验谈
  10. web基础知识回顾(一)