美文网首页
Smashing Nodejs 读书笔记(二)

Smashing Nodejs 读书笔记(二)

作者: cherry_liulei | 来源:发表于2018-05-01 12:44 被阅读7次

    了不起的Node.js:将JavaScript进行到底

    书名:SMASHING Node.js : JavaScript Everywhere

    原作者:(美)劳奇 Rauch.G

    译者:赵静

    出版日期:2014.1

    Node中的JavaScript

    1. global对象

    在浏览器中,全局对象指的是window对象。在window对象上定义的所有内容(属性和函数)都可以被全局访问到。

    setTimeout  === window.setTimeout
    document  === window.document
    

    Node中的2个全局对象:

    • global--类似window对象,global对象上的属性都可以被全局访问到
    • process-所有全局执行上下文中的内容都在preocess对象中。

    2. 模块系统

    Node内置了很多实用的模块作为基础工具,包括http、net、fs等。

    Node摒弃了采用定义一堆全局变量的方式,转而引入了一个简单却强大无比的模块系统,该模块系统有3个核心的全局对象:requiremoduleexports

    绝对模块

    绝对模块是指Node通过在其内部node_modules查找到的模块,或者Node内置的如fs这样的模块。

    require('http');
    require('fs');
    

    直接通过名字来require这个模块,无须添加路径名的,就是绝对模块。

    对于使用npm来安装的模块,例如安装colors模块,当安装完毕后,其路径就变成了./node_modules/colors

    可以直接通过名称来require。

    require('colors);
    

    这种情况也是绝对模块。

    相对模块

    相对模块是将require指向一个相对工作目录中的js文件。例如

    require('./src/module_a');
    require('./src/module_b');
    

    暴露API

    暴露一个对象

    在默认情况下,每个模块都会暴露出一个空对象。可以使用exports来暴露对象的属性和函数。

    // module_a.js
    exports.name = 'john';
    exports.data = 'this is some data';
    
    var privateVar = 5;
    
    exports.getPrivate = function(){
        return privateVar;
    }
    

    在main.js 中调用

    var a = require('./src/module_a');
    
    console.log(a.name); //john
    console.log(a.data); // this is some data
    console.log(a.getPrivate()); // 5
    

    暴露一个构造函数

    person.js

    module.exports = Person; // 对module.exports重写
    
    function Person(name){
        this.name = name;
    }
    
    Person.prototype.talk = function(){
        console.log('my name is' , this.name);
    }
    

    main.js

    var Person = require('./src/person');
    
    var John = new Person('John');
    John.talk(); // my name is John
    

    事件

    在Node中事件的监听和分发使用EventEmit,定义了on 、 emit、once等方法。

    使用EventEmitter

    var EventEmitter = require('events');
    var a = new EventEmitter();
    a.on('event', function(){
        console.log('event called.');
    });
    
    a.emit('event');
    

    让自定义的类也可以使用事件监听,需要继承自EventEmitter。

    使用原型继承方式

    修改person.js

    module.exports = Person;
    
    function Person(name){
        this.name = name;
    }
    
    const EventEmitter = require('events');
    Person.prototype = new EventEmitter;
    
    Person.prototype.talk = function(){
        console.log('my name is' , this.name);
    }
    

    在main.js中调用

    var Person = require('./src/person');
    
    var John = new Person('John');
    John.talk();
    John.on('sleeping', function(){
        console.log('sleeping called.')
    });
    
    John.emit('sleeping');
    

    ES6继承方式

    const EventEmitter = require('events');
    
    class MyEmitter extends EventEmitter {}
    
    const myEmitter = new MyEmitter();
    myEmitter.on('event', () => {
      console.log('an event occurred!');
    });
    myEmitter.emit('event');
    

    相关文章

      网友评论

          本文标题:Smashing Nodejs 读书笔记(二)

          本文链接:https://www.haomeiwen.com/subject/rtvxrftx.html