资讯专栏INFORMATION COLUMN

through2.js,xtend.js源码

pekonchan / 2453人阅读

摘要:优化性能这里有个有意思的地方。在多个参数的情况下。无则跳过,支持覆盖不可变。与原先不同的是,这里使用了一份初始化的对象引用来作为容器承载其余没有不同

through2 本质上是一种transform的流
被封装更好地操作流
var Transform = require("readable-stream/transform")
  , inherits  = require("util").inherits
  , xtend     = require("xtend")

function DestroyableTransform(opts) {
  // 继承Transform
  Transform.call(this, opts)
  this._destroyed = false
}

inherits(DestroyableTransform, Transform)
// 原型接口destory 用来关闭流
DestroyableTransform.prototype.destroy = function(err) {
  if (this._destroyed) return
  this._destroyed = true
  
  var self = this
  process.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     = transform
      transform = options
      options   = {}
    }
    // 这种匿名函数我们一般可以用来做二次判断触发
    if (typeof transform != "function")
      transform = noop

    if (typeof flush != "function")
      flush = null

    return 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 = transform

  if (flush)
    t2._flush = flush

  return 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))
        // 这里就是直接自动new
      return new Through2(override)

    this.options = xtend(options, override)
    // 添加配置

    DestroyableTransform.call(this, this.options)
  }

  inherits(Through2, DestroyableTransform)

  Through2.prototype._transform = transform

  if (flush)
    Through2.prototype._flush = flush

  return Through2
})

// Object模式的简单封装
module.exports.obj = through2(function (options, transform, flush) {
  var t2 = new DestroyableTransform(xtend({ objectMode: true, highWaterMark: 16 }, options))

  t2._transform = transform

  if (flush)
    t2._flush = flush

  return t2
})
xtend lib //简单的继承 两种,一种可变  一种不可变
module.exports = extend

var 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 = extend

var 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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/93225.html

相关文章

  • Flink Metrics 源码解析

    摘要:有如下模块源码解析源码解析源码解析源码解析源码解析源码解析源码解析源码解析源码解析使用和监控和博客从到学习介绍从到学习上搭建环境并构建运行简单程序入门从到学习配置文件详解从到学习介绍从到学习如何自 Flink Metrics 有如下模块: Flink Metrics 源码解析 —— Flink-metrics-core Flink Metrics 源码解析 —— Flink-metr...

    sshe 评论0 收藏0
  • 精读《源码学习》

    摘要:精读原文介绍了学习源码的两个技巧,并利用实例说明了源码学习过程中可以学到许多周边知识,都让我们受益匪浅。讨论地址是精读源码学习如果你想参与讨论,请点击这里,每周都有新的主题,周末或周一发布。 1. 引言 javascript-knowledge-reading-source-code 这篇文章介绍了阅读源码的重要性,精读系列也已有八期源码系列文章,分别是: 精读《Immer.js》源...

    aboutU 评论0 收藏0
  • JDK1.8源码分析01之学习建议(可以延伸其他源码学习)

    摘要:唐老师,回答道读源码是要建立在你的基础经验足够的情况下。除了自己去阅读源码之外,比如学习某个类的时候,可以专门结合一些优质的博客针对性的对比学习,并查漏补缺。制定源码学习计划。多调试,跟踪源码。如若有好的学习方法,可以留言一起交流学习。 序言:目前看一看源码,来提升自己的技术实力。同时现在好多面试官都喜欢问源码,问你是否读过JDK源码等等? 针对如何阅读源码,也请教了我的老师。下面就先...

    ky0ncheng 评论0 收藏0
  • 源码之下无秘密 ── 做最好的 Netty 源码分析教程

    摘要:背景在工作中虽然我经常使用到库但是很多时候对的一些概念还是处于知其然不知其所以然的状态因此就萌生了学习源码的想法刚开始看源码的时候自然是比较痛苦的主要原因有两个第一网上没有找到让我满意的详尽的源码分析的教程第二我也是第一次系统地学习这么大代 背景 在工作中, 虽然我经常使用到 Netty 库, 但是很多时候对 Netty 的一些概念还是处于知其然, 不知其所以然的状态, 因此就萌生了学...

    shenhualong 评论0 收藏0

发表评论

0条评论

pekonchan

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<