node基础

来源:互联网 发布:c语言char什么意思 编辑:程序博客网 时间:2024/06/09 21:37

一.什么是模块:

在node中,文件和模块是一一对应的,也就是说一个文件就是一个模块;
每个模块都有自己的作用域;
我们通过var声明的变量并非全局而是该模块作用域下的

var a = 100;global.a=200;console.log(a);//100console.log(global.a)//200


二.加载机制

路径问题:现在1.js和2.js都在F:/mynode路径下,1.js想要加载2.js

       绝对路径:require('F:/mynode/2.js');必须加上单引号。

       相对路径:require('./2.js');尽管在同一个文件夹下,也要加上./

       如果写成   require('2.js');就会加载node中的核心模块或者node_modules。

查找问题:

如果写成require('./2');

1.首先按照加载的模块的文件名称进行查找,例如:

现在1.js、2.js和2文件都在F:/mynode路径下,require('./2');会加载2,不会加载2.js文件
2.如果没有找到,则会在模块文件名称后加上.js的后缀进行查找,例如:

现在1.js和2.js都在F:/mynode路径下,require('./2');会先找文件名称为2的文件,没有找到,

在文件名称后面加上后缀.js,就会加载2.js文件

3.如果没有找到,则会在模块文件名称后加上.json的后缀进行查找
4.如果没有找到,则会在模块文件名称后加上.node的后缀进行查找

三.模块module和exports

在一个模块中通过var定义的变量,其作用域范围是当前模块,外部不能够直接访问
如果我们想一个模块访问另一个模块中定义的变量,可以:
1.把变量作为global对象的一个属性,但是这样的做法是不推荐的
2.使用模块对象module(保存提供和当前模块有关的一些信息)

Module {
  id: '.',
  exports: {},
  parent: null,
  filename: 'F:\\mynode\\1.js',
  loaded: false,
  children: [],
  paths: [ 'F:\\mynode\\node_modules', 'F:\\node_modules' ] }

1.js文件

require('./2.js');//返回加载模块的module.exports

var m5 = require('./2.js');//返回加载模块的module.exportsconsole.log(m5.a);
2.js文件

var a = 100;module.exports.a = a;
在模块作用域内,还有一个内置的模块对象,exports,他其实就是module.exports
console.log(module.exports === exports);//true
因此2.js文件可以这样写:

var a = 100;exports.a = a;
注意:

在使用module.exports和exports不要修改他们的指向,只是通过添加属性来操作,否则会切断两者之间的联系。

当向外暴露一个类(构造函数)时,module.export = 构造函数名;

People.js

function People(name,sex,age){this.name = name;this.sex = sex;this.age = age;}People.prototype = {sayHello : function(){console.log(this.name +' is ' + this.age);}};module.exports = People;
a.js

var People = require('./People.js');var Jack = new People('Jack','male','18');Jack.sayHello();
People.js和a.js在同一路径下,当执行node a.js命令时,输出结果:Jack is 18
如果通过exports.People = People;这种方式向外暴露构造函数People,则a.js要写成下列方式:

var Jack = new People.People('Jack','male','18');这是不推荐的,规定不能这样写。

var People = require('./People.js');var Jack = new People.People('Jack','male','18');Jack.sayHello();
总之,向外暴露类(构造函数)时,使用module.export = 构造函数名;
再说一下this的问题:

function People(){}People.sex = 'male';People.foo = function(name,sex){this.name = name;this.sex = sex;console.log(this.sex);}var Lucy = new People.foo('Lucy','female');//femaleconsole.log(People.sex);//maleconsole.log(Lucy.sex);//female
当执行new操作符时,改变了this指向,指向Lucy对象



原创粉丝点击