through2.js,xtend.js源码
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源码相关推荐
- chosen.jquery.js 、chosen-select 源码修改控制 chosen:updated 方法动态更新下拉框选项不更新搜索框值 ,chosen 实现远程搜索加载下拉选项
chosen.jquery.js .chosen-select 源码修改控制 chosen:updated 方法动态更新下拉框选项不更新搜索框值,chosen 实现远程搜索加载下拉选项 chosen. ...
- 100行JS代码实现❤坦克大战js小游戏源码 HTML5坦克大战游戏代码(HTML+CSS+JavaScript )
坦克大战js小游戏源码 HTML5坦克大战游戏代码(HTML+CSS+JavaScript ) HTML5坦克大战网页小游戏,完美还原小霸王学习机效果,以坦克战斗及保卫基地为主题,属于策略型类游戏. ...
- [Vue.js进阶]从源码角度剖析vue-router(三)
前言 在上篇中主要叙述了 vue-router 中生成 $route 对象的时机,路由懒加载的原理,以及异步路由之前执行的一系列路由守卫 在本篇中会讲述: 异步路由解析成功后执行的一系列路由守卫 vu ...
- KRPano JS 场景编辑器源码
KRPano JS编辑器,可以运行在Node环境中. 源码地址:https://github.com/xxweimei/krpano-editor-js 或者下载zip包:http://pan.bai ...
- 深入理解 Node.js 中 EventEmitter源码分析(3.0.0版本)
events模块对外提供了一个 EventEmitter 对象,即:events.EventEmitter. EventEmitter 是NodeJS的核心模块events中的类,用于对NodeJS中 ...
- 关于鸿蒙系统 JS UI 框架源码的分析
鸿蒙是华为研发的新一代终端操作系统,能适用于 IoT.手表.手机.Pad.电视等各种类型的设备上,扛起"国产操作系统"的大旗,也遭受了很多非议.2021 年 6 月初发布了 Ope ...
- commander.js使用及源码分析
commander.js commander是一个轻巧的nodejs模块,提供了用户命令行输入和参数解析强大功能. commander的特性: 自记录代码 自动生成帮助 合并短参数 默认选项 强制选项 ...
- ramda.js的compose源码解析
前言 上一篇文章介绍了javascript中的compose函数的实现,我是用了递归的思想去让函数依次执行,lodash中是用了迭代的思想依次执行函数,但实现了以后我还是觉得有些别扭,仔细想想,我们实 ...
- 一个事件订阅和发布的库(onfire.js)的源码浅析
文章目录 一.onfire.js介绍 二.API介绍 三.变量浅析 四.订阅函数浅析 五.发布函数浅析 六.全部源码 一.onfire.js介绍 一个简单实用的事件订阅和发布的库. onfire.js ...
- 迷你 JS 框架 Hyperapp 源码解析
Hyperapp 是最近热度颇高的一款迷你 JS 框架,其源码不到 400 行,压缩 gzip 后只有 1kB,却具有相当高的完成度,拿来实现简单的 web 应用也不在话下.整体实现上,Hyperap ...
最新文章
- 特斯拉又被挖墙脚:Autopilot总监离职,加入苹果造车团队
- opencv3异常 库找不到 no such file
- 利用返回引用来操作结构体
- fft函数图像横坐标是什么_10分钟学会:函数图像的平移与伸缩变换
- Android 中的Json解析工具fastjson 、序列化、反序列化
- 探讨浏览器CSS选择器的权重!!!
- macos上的硬盘检测工具_如何在MacOS上使用双镜头面部检测器(DSFD)实现90%以上的精度
- Win2008配置终端服务网络负载平衡实战 -2
- SpringMVC ------使用POJO对象绑定请求参数值
- 简易JTAG烧写程序的执行逻辑和流程
- linux打开九针串口,RS232 9针串口定义
- PDCN循环 与 GTD时间管理
- 《控制论导论》读书:机构-黑箱
- 通达oa考勤可以代打吗_OA让考勤更方便
- 简单快速的运行 Zheng 平台(配置篇)
- 英语学习逆向法 (钟道隆 著)
- 右手坐标系下球面参数方程的推导
- CDH-TXKT-集群的维护
- 电大考试计算机应用基础考试试题,电大计算机应用基础网络教育统考考试(2013真题卷)...
- oracle语句怎么查工作日,SQL查询工作日 - Oracle开发 - ITPUB论坛-中国专业的IT技术社区...