Node.js 学习笔记

因为之前对Node.js有一定的了解,所以很多基础已经有了,很多简单的入门的东西不会放在这里,更多的是一些自己原来的疑惑的梳理。

Node.js类的定义:

因为Node.js是弱类型的语言,相比其他弱类型语言,可以说是“将一切是对象”发挥到了极致,并且关键字里面也没有class,所以严格上说Node.js并没有定义类的机制。

Node.js 中的类都声明为函数,通过new 关键字创建对象。

function Hello() {
  this.name = '';
  this.set = function(name) {
    this.name = name;
  }
  this.get = function() {
    return this.name;
  }
}

创建实例

hello = new Hello();

除了标准的定义方法我们还可以通过定义一个返回一个对象的函数实现。

我推荐用函数创建一个完整的对象并返回

function Hello() {
  hello = {};
  hello.set = function(name) {
    this.name = name;
  };
  hello.get = function() {
    return this.name;
  };
  return hello;
}

通过 hello = Hello(); 的方式实例化对象。

另外一种方式是利用闭包实现的

function Hello() {
  var name = '';
  function setName(newName) {
     name = newName;
  }
  function getName() {
    return name;
  }
  return {
    set: setName,
    get: getName,
  };
}
function Hello(name='', way='') {
  if (name!='') {
    this.name = name;
    this.greet = function () {
    console.log('hello ' + name);
  };
  } else {
    if (way == '') {
    this.way = 'wave';
  } else {
    this.way = way;
  }
  this.greet = function () {
    console.log(way + ' to everyone!');
  };
  }
}

同样通过 hello = Hello(); 的方式实例化对象。

第二种方式有一个问题就是 hello.name 并不是set函数和get函数操作的那个name,而且新定义hello的函数也没法直接操作set函数和get函数中操作的name,这就是闭包的特点,如果你想保护什么变量,当然可以采用这种方式,不过这种方式实在太繁琐了,而且新手很难理解。
其实Node.js定义类的方式类似与其他语言的构造函数,即使是静态语言,创建实例化对象都是通过执行构造函数实现的,只不过有些语言的构造函数是隐式声明和执行的罢了。
所以我们也可以在构造函数中加一些判断,以适应不同的情况。
比如:

参数传递顺序:

继上面的例子

function Hello(name='', way='') {
  if (name!='') {
    this.name = name;
    this.greet = function () {
      console.log('hello ' + name);
    };
  } else {
    if (way == '') {
      this.way = 'wave';
    } else {
      this.way = way;
    }
    this.greet = function () {
      console.log(way + ' to everyone!');
    };
  }
}

如果我们示例化对象的时候使用

shakeman =new Hello(name=”, way=’shake’);

bowman = new Hello(way=’bow’, name=”);

结果一样不一样呢?

结果是不一样的,通过这个例子我发现Node.js并不是通过参数的左值进行确定值赋给谁,而是按照传参的顺序确定的。

前者定义的对象是

Hello { way: ‘shake’, greet: [Function] }

后者定义的对象是

Hello { name: ‘bow’, greet: [Function] }

用过python的人看到这里可能会觉得难受了。

双引号和单引号有没有区别:

几乎所有文档里都说单引号和双引号功能上没有区别,但是我在生成query语句的时候却发现并不相同。

比如

var query =’select * from test where name =”my name”‘.;

打印出的语句是

select * from test where name =”my name”。

var query =”select * from test where name =’my name'”;

打印出来却是

select * from test where name =\’my name\’

也就是说使用双引号,node会假设创建的字符串是原始字符串,并对需要转义的字符使用转义字符。

当然,这只是我测试的结果,我还没有找到证据证明我的这个观点。