Node.js学习日记(三):Node.js中的JavaScript

266 阅读2分钟

global 对象

浏览器中的全局对象:window

Node中的全局对象:

  • global:可以全局访问所有属性
  • process:只有一个process对象,可以设置进程名
    • process.nextTick函数:相当于setImmediate函数,将函数的执行事件规划到下一个事件循环里
  • console:console.log()console.error()

模块系统

核心的三个全局变量: requiremoduleexports

绝对模块

可以直接在node_modules里找到的模块,可以直接引入,无需添加路径名

相对模块

通过路径来找到相对的模块位置,从而引入。可以通过export.method=function(){}暴露模块中定义的方法或者属性。或者可以彻底重写modules.exports

事件

Event Emitter

浏览器用于监听事件的DOM API

  • addEventListener
  • removeEventListener
  • dispatchEvent node则暴露的是Event EmitterAPI
  • .on
  • .emit
  • .removeListener
var EventEmitter=require('events').EventEmitter
var a=new EventEmitter()
a.on('event',function(){
    console.log('event called')
})
a.emit('event')

书上原来的代码是这样写的:,a=new EventEmitter,发现new一个对象没有加括号,确实是一个知识盲区。首先我们要知道什么是默认构造函数,什么是重载构造函数,什么是复合默认构造函数。

默认构造函数:编译器会为每一个类默认提供一个构造函数,称之为默认构造函数。默认构造函数一般参数为空。

复合默认构造函数:一个由用户自定义的所有形式参数都赋有默认值的构造函数,称之为复合默认构造函数。

(1)加括号

1. 若括号为空,即无实参项,那么理解为调用默认构造函数;
2. 若括号非空,即有实参项,可以理解为调用重载构造函数,或 复合默认构造函数。

(2)不加括号   调用默认构造函数,或复合默认构造函数。

也就是说,不加括号会调用的是编译器提供的默认函数,默认构造函数不复存在时,用户必须为这个类再自定义一个复合默认构造函数(选所有自定义构造函数其中之一,把形式参数均赋默认值即可)。

回到正题,eventListener还可以添加到自己的类中,对类中的事件进行监听

var EventEmitter=require('events').EventEmitter
, MyClass=function(){
    this.speak=function(){
        console.log('speak')
    }
}
MyClass.prototype.__proto__=EventEmitter.prototype
,a=new MyClass
a.on('speak',function(){
    console.log('I heard speak')
})
a.emit('speak')

注意这里on监听的是emit的事件,而并不是MyClass的方法speak

ServerRequest

ServerRequest继承自 EventEmitter,且会分发事件data和end,比如它会先将请求数据缓存,等到所有数据接受完毕后再进行处理。

var http=require('http')
http.Server(function(req,res){
    var buf=''
    req.on('data',function(data){
        buf+=data
    })
    req.on('end',function(){
        console.log('transmit over')
    })
})

buffer

buffer表示一个固定分配的全局对象,由八位字节元素组成。帮助我们创建一个字符串来表示一个复杂文件(类似图片)

var buffer=new Buffer(string,'base64')
require('fs').writeFile('',buffer)