@jimbo
        
        2016-07-03T14:13:29.000000Z
        字数 2758
        阅读 861
    node.js是一个JavaScript运行环境。实际上是对googleV8引擎(应用于google chrome浏览器)进行了封装。
能处理高并发请求,并且由于是事件驱动,因此可以更好的节约服务器内存资源。
简单说就是可以不等上一段代码执行完毕就可以去执行另一段代码
var http = new require("http");// 创建一个http对象http.createServer(function(request, response) {// 在这个函数内部编写要在网页上显示的内容// 这个是添加网页<head>标签的内容response.writeHead(200, {"Content-Type" : "text/plain"});// 这里是添加网页<body>标签的内容response.end("hello lyr");}).listen(8080, "127.0.0.1"); // 这句话的意思是监听8080端口,访问地址是127.0.0.1/*上面代码运行后,就会一直监听电脑的8080端口。当有客户端发送http Request发到该地址的时候,response就会返回给该客户端。比如我们在浏览器中输入`127.0.0.1:8080`,回车后浏览器就会显示"hello lyr"。*/
假如我们有fun1Sync(),fun2(),两个函数。 
同步调用:
fun1Sync();console.log("hello lyr");// 必须等fun1Sync()执行完后才能执行该行代码,这就是同步调用
异步调用:
fun2();console.log("hello lyr");// 不等fun2()执行完就可以执行该代码,则为异步调用
在上面我们知道了什么是同步调用和异步调用,异步调用的好处在于不用一直等待一段代码执行完毕就可以继续执行,程序所以效率会大大提高。但是问题来了,那我们如何知道异步调用的代码是否已经执行完毕了呢?
例如我要去异步调用一个函数计算a + b,然后输出一下结果。
如果使用同步调用我们一般会这样做:
var a = 520;var b = 1;var c = calcSync(a, b);// 在这里会停止往下执行,等待calcSync()函数的执行结果console.log("result=" + c);console.log("over~");/*result=521over~*/
如果我们是使用异步函数呢?怎么才能知道已经有计算结果了呢。这个时候我们就需要使用回调了。
var a = 520;var b = 1;function calc (a, b, callback) { // 这里不会停下运行var c = a + b;callback(c);}calc(a, b , function(result) {console.log("result=" + result);});console.log("over~");/*over~result=521*/
上面的代码中,我们把一个叫做callBack的函数当做参数传递给了calc函数,当异步执行的函数执行完毕后回来调用了我们传递的callBack函数,我们可以callBack中执行后续的逻辑代码,这样就解决了我们问题。所谓的回调,就是在执行完成后调用我们传递的函数而已。
NPM只是Node.js模块的管理工具而已,考试意义不大
模块,其实就是封装好的Node.js代码,用于为开发者提供快速开发的API,就是C/C++里面的头文件。
关键是要明白exports关键字的用处。
他其实就相当于类中的private,public关键字一样,控制访问权限的。当文件模块的变量是exports或者module.exports类型的时候,外部就可以调用它,否则就不能被调用。
c++中的继承是以class为单位的,但是node.js中的继承是以模块为单位的,但是其本质还是一样的。只要A继承了B,就可以拥有B中的属性和方法了。例如B中有一个name属性和一个sayHello的方法,只要A继承B后,A中也就有了name属性和sayHello方法。在node.js中,也是一样的,只是实现的方法不太一样而已。
node.js中要使用util.inherits(con, superCon);来实现。 
结合书上的例子:
// 当前目录下一个叫做Person的模块// 这段代码就是创建了一个Person类// 这个类有一个属性name和一个方法sayfunction Person(name) {this.name = name;this.say = function (word) {console.log(word);}}module.exports = Person; // 对方暴漏Person方法
现在我们继承person,实现一个student类,增加学号属性和做作业方法,并且重写他的say方法。
// 当前目前下一个叫做Student的模块var Person = require('./Person'); // "./"就代表了当前目录var util = require("util"); // 获取util模块function Student(name, number) {Person.call(this, name); // 调用Person的构造方法this.number = number; // 为Student添加number属性this.say = function(word) { // 重写父类的say方法console.log("我学习呢~别说话");}}util.inherits(Student, Person); // 实现继承Student.prototype.doHomeWork = function() { // 增加方法学习console.log("我学习呢~");}module.exports = Student; // 对外暴露Student方法
// 调用Student类var Student = require('./Student');var stu = new Student("lyr", 201311010345);console.log(stu.name+stu.number);
运行效果:

*如果想让你的模块返回一个类,必须如上那么赋值module.exports,不能多次赋值或者不赋值
如果对moudle.exports有疑惑 点击这里