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