global 对象
浏览器中的全局对象:window
Node中的全局对象:
- global:可以全局访问所有属性
- process:只有一个process对象,可以设置进程名
- process.nextTick函数:相当于setImmediate函数,将函数的执行事件规划到下一个事件循环里
- console:
console.log()、console.error()
模块系统
核心的三个全局变量: require、module、exports
绝对模块
可以直接在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)