返回顶部
首页 > 资讯 > 后端开发 > Python >D1.Nodejs 入门篇
  • 392
分享到

D1.Nodejs 入门篇

入门篇Nodejs 2023-01-31 08:01:02 392人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

分享第一篇,关于 nodejs —— javascript 的常用知识以及如何从 Javascript 开发者过渡到 nodejs 开发者(不会介绍具体的框架)。在读本文前,希望你对 javascript 有一些初步的认识。 Javasc

分享第一篇,关于 nodejs —— javascript 的常用知识以及如何从 Javascript 开发者过渡到 nodejs 开发者(不会介绍具体的框架)。在读本文前,希望你对 javascript 有一些初步的认识。

Javascript 是一门原型模型的解释型语言。解释型将在后面的 NodeJS 里面讨论,原型链是 es6 之前的 Javascript 的面向对象的实现方式之一,在 ES6 中支持的 class 增加了一种新的实现方式。在 Javascript 里面所有东西都是对象,包括 “类”。接触过 ruby/python 的元编程的可能会觉得这个很熟悉,Javascript 也很容易是实现出动态的生成类的方法。

1. 基于原型链实现的简单的“类”

javascriptvar Person = function(name){
  this.name = name;
};

Person.staticSay = function(name){
  console.log('Hello ' + name);
};

Person.prototype.sayHi = function(){
  Person.staticSay(this.name);
}

提一些常见的规范,例如 Javascript 中所有的方法都是驼峰命名,优先使用单引号,两个空格等等,更多的规范可以参考 https://GitHub.com/airbnb/javascript。

代码中的staticSay为静态方法,即只能通过 Person.staticSay来调用。 当上面的 Person 生成实例的时候,例如 var vincent = new Person('vincent');的时候,vincent会自动继承 Person.prototype 的所有方法(代码中的 this 指代的是当前上下文,即上文中的 vincent)。

同时也可以动态的为对象 vincent 添加方法,例如如下代码:

javascriptvar vincent = new Person('vincent')
vincent.tellName = function(){
  console.log('Hi, i\'m am' + this.name)
};

然后当你需要模拟继承的时候,就需要在 prototype 上下功夫。例如下面使用 Worker.prototype = new Person() 来实现,new Person() 返回的实例对象带着的所有方法、属性都被赋给了 prototype,变相模拟了继承。这种方式最终一层层的往上找 prototype 里面的内容(因为每个实例具有的方法都在 prototype 里面,往上直到 Object)。当然也可以通过遍历来进行对 prototype 赋值来模拟继承。

2. 上下文切换

上下文最直观的表现就是代码块中的 this,通常在面向对象的编程中用到,来指代当前“类”生成的对应实例,与其他语言的 self一致。

继续用上文中的例子,上文中已经实现了一个 Person.prototype.sayHi方法,现在我有一个新的对象,代码如下:

javascriptvar Cat = function(name){
  this.name = name;
}

var c = new Cat('Tomcat');

如果某天突然异想天开希望这只猫像人一样介绍他自己怎么办,他自己没有 sayHi 这个方法。但是可以通过 console.log(Person.prototype.sayHi)是可以拿到人类的 sayHi 方法的,怎么让猫也可以使用呢?

Javascript 有两个方法,callapply,他们的区别就是参数不同(自行谷歌),作用是用来切换上下文。简单说就是可以把 Person.prototype.sayHi这个函数中的 this 变成其他对象。使用方式: Person.prototype.sayHi.call(c)

这个实用嘛?例如如下场景:

javascriptvar doSomething = function(){
  var persons = arguments;
};

上面的函数中,通过关键字 arguments获取所有的参数来支持不定数量的参数。现在我们希望对 persons用一些原属于 Array 类型的方法,如何实现呢?这里就可以用上下文切换来实现:

javascriptvar doSomething = function(){
  var persons = arguments;
  // 使用 Array 的 slice 方法,将 arguments 对象转变为 Array 实例
  var persons_arr = Array.prototype.slice.call(arguments);
};

3. 闭包

先来段常见的代码

javascriptfor (var i = 0; i < 3; i ++){
  setTimeout(function(){
    console.log(i);
  }, i)
}

这个会输出什么结果呢?依次输出 0 1 2 ?实际情况是,当 setTimeout第一次执行回调的时候,for 循环已经结束了,也就是说此时的 i 已经是 3 了,导致最终的输出结果是 3 3 3。

当你需要保护某一个变量,使得他不被外围的代码所影响的时候,你可能就需要考虑下闭包 —— 一个封闭的作用域的代码块。

javascriptfor (var i = 0; i < 3; i ++){
  +function(i){
    setTimeout(function(){
      console.log(i);
    }, i)
  }(i)
}

咦, +是干嘛的,有没有其他方式实现,请自行谷歌。闭包内的 i 的作用域是一个封闭的作用域,所以最终 闭包内的 i 一直没有被外面的执行改变,所以可以成功的输出 0 1 2。


简单的介绍了 javascript 部分特性,关键字 原型链、call 和 apply、arguments 关键字,更多的建议可以看看例如权威指南这样的书,或者快速了解下基本的类型以及每个类型有的方法。有一些比较神奇的代码,例如获得当前的代码的字符串,然后进行处理得到自己想要的内容,使用 getter 和 setter 在用户对对象属性获取或者赋值的时候做一些特殊的操作等等。

4. NodeJS 和 Javascript 的开发区别

这块主要介绍 require 加载的基础知识,首先先介绍一些代码:

javascript// a.js
module.exports = {
  name: "a",
  doSomething: function(){
    return "something";
  }
}

// b.js
var a = require('./a')
global.a_name = a.name;

// c.js
require('./b');
console.log(a_name) // 执行后打印 a 

当我们执行 node c.js的时候发生了什么?

  1. require是 nodes 关键字,虽然 NodeJS 是以异步著称,但是他的 require都是阻塞的。否则就会出现还没有载入其他模块,已经开始执行下面的代码的情况。
  2. require.resolve()方法是用来找出你所引用的文件的实际路径,找出后 Nodejs 会在 require.cache里面寻找是否有缓存,没有的话则会读取文件然后解析,所以通常情况下,一个 js 文件里面的执行的代码只会在第一次被 require 的时候被执行。(tip. require.cache 如果有需要的话是可以手动删除一些东西的,然后可以某种程度上可以执行多次)
  3. 当 b.js 开始执行的时候,他需要先载入 a.js,module.exports告诉 Nodejs 这个文件对外暴露写什么,例如 a.js 暴露的是一个对象,包含 name 属性和 doSomething 方法。然后 b.js 中的 a 变量其实就是这个对象。
  4. 执行完获取 a.js 后,继续回到 b.js ,global.a_name 相当于声明了一个全局变量,这个和前端中的 window.a_name = a.name 效果类似。
  5. 最终过程完成,c.js 执行输出值。

5. 异步的底层原理

NodeJS 很容易给人一种使用上的错觉,就是写了很久都可能不知道底层的异步是怎么实现的。(下面的理解主要来自于对 python3.4 中的 asyncio 的理解,如有错误欢迎指出)。

NodeJS 底层的 libev 分别在 Window 下使用 iocP 和 *nix 下使用基于 AIO 的 libeio 来实现异步。通过系统层面的技术,最后达到一个目的,就是应用程序发起一个异步请求,最终在系统执行完后,系统通知应用程序处理完成。在这个过程中,应用程序可以将之前的处理挂起/推入线程池中等待执行,而应用程序在此期间可以执行其他任务。

整个的运行通过系统层面的事件循环来进行运作。例如 Python 提供了类似于 run_until 以及 run_forever 的这样的方法,保证在异步执行之前程序不会结束运行。将整个异步想象成一个一直在运作的车间,车间里面的机器负责查看包裹并盖章这样的操作,工人拿到了一个包裹,然后贴上相应的标签后放进去,等车间处理完后再交还给工人,工人根据包裹上他之前贴上的标签和被车间贴上的标签,进行下一步的处理。工人无需等待包裹检查完毕才能进行下一个,他只需要接受简单处理,然后放入车间进行检查。然后等某个时间车间返回给他某个包裹,他再去进行下一步的操作。


目前主要还是只介绍了一些语言层面的知识,但是只有这些距离开发一个完整的 WEB 还有一些距离,将在后面继续介绍。包括 RedisNginx测试驱动等等。

原文:Https://github.com/vincenting/note/issues/1

--结束END--

本文标题: D1.Nodejs 入门篇

本文链接: https://lsjlt.com/news/192504.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • D1.Nodejs 入门篇
    分享第一篇,关于 NodeJS —— Javascript 的常用知识以及如何从 Javascript 开发者过渡到 NodeJS 开发者(不会介绍具体的框架)。在读本文前,希望你对 javascript 有一些初步的认识。 Javasc...
    99+
    2023-01-31
    入门篇 Nodejs
  • Nodejs学习笔记之入门篇
    分享第一篇,关于 NodeJS —— Javascript 的常用知识以及如何从 Javascript 开发者过渡到 NodeJS 开发者(不会介绍具体的框架)。在读本文前,希望你对 javascript ...
    99+
    2022-06-04
    学习笔记 入门篇 Nodejs
  • Python入门篇(二)
    1、Python模块 ### sys模块 #!/usr/bin/python # _*_ coding:utf-8 _*_ # Aothr: Kim import sys #导入sys模块 print (sys.path) #打印pyth...
    99+
    2023-01-31
    入门篇 Python
  • Python入门篇(一)
    python学习博客:http://www.cnblogs.com/haiyan123/p/8387770.html#lable1http://www.cnblogs.com/alex3714http://www.cnblogs.com/...
    99+
    2023-01-31
    入门篇 Python
  • nodejs教程之入门
    前言 再不学nodeJs,我们就老了......在HTML5大浪袭来的时候,很多先辈就开始了NodeJs之旅,而那时我还在做服务器端的程序 后来转成前端,和梯队的距离已经很大了,因为我会服务器端语言,还干了...
    99+
    2022-06-04
    入门 教程 nodejs
  • Android 测试入门篇
    Android构架 1. Application 应用程序层:用Java语言编写的运行在虚拟机的程序 用户直接使用的功能,其基本应用比如:电话、联系人、短信、邮件等,还有无数...
    99+
    2022-06-06
    测试 Android
  • MySQL--------入门简介篇
    1. 背景   * MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在...
    99+
    2024-04-02
  • Objective-C 入门篇(推荐)
    目录前言基本数据类型其他数据类型id类型BOOL类型nil和NilNSString(不可变字符串)NSMutableString(可变字符串)NSInteger、NSUInteger...
    99+
    2022-05-20
    ObjectiveC 入门篇 Objective-C
  • 入门MySQL——DML语句篇
    前言:  在上篇文章中,主要为大家介绍的是DDL语句的用法,可能细心的同学已经发现了。本篇文章将主要聚焦于DML语句,为大家讲解表数据相关操作。 这里说明下DDL与DML语句的分类,可能有的同学还不太清楚...
    99+
    2024-04-02
  • Python_实用入门篇_02
    Python对象类型   包括数字、字符串、列表、字典、元组、集合 本篇将对这些基本的内置对象类型进行简介 1.对象类型:   ①对象类型的概念:     对象是人们要进行研究的任何事物,从最简单的整数到复杂的飞机等均可看作对象,它不仅...
    99+
    2023-01-30
    入门篇
  • Python_实用入门篇_01
    运行Python程序,变量,常量,注释   1.运行Python程序的几种方法(前提是已经装上了Python解释器):   ①我们可以在命令提示符(cmd)中输入"Python"命令来启动Python解释器,通过以下命令执行该脚本:py...
    99+
    2023-01-30
    入门篇
  • Python_实用入门篇_00
    Python历史 1.Python的诞生   Python的创始人为Guido van Rossum。1989年圣诞节期间,在阿姆斯特丹,Guido为了打发圣诞节的无趣,决心开发一个新的脚本解释程序,作为ABC语言的一种继承。之所以选中...
    99+
    2023-01-30
    入门篇
  • Python_实用入门篇_05
    编码及运算符  1.编码    1.编码的概念     在计算机硬件中,编码(coding)是指用代码来表示各组数据资料,使其成为可利用计算机进行处理和分析的信息。代码是用来表示事物的记号,它可以用数字、字母、特殊的符号或它们之间的组合...
    99+
    2023-01-30
    入门篇
  • Python_实用入门篇_04
    Python中的if和while语句 1.if流程控制      1.语法结构                                          if 条件测试为 true:                       ...
    99+
    2023-01-30
    入门篇
  • Python_实用入门篇_03
    用户交互以及格式化输出  1.用户交互   ①input函数     input函数等待用户输入,然后前面的变量指向输入的内容,注意,input函数出来的数据类型全是字符串类型 x= input(“此括号里的内容会直接打印出来:”) ...
    99+
    2023-01-30
    入门篇
  • Python_实用入门篇_08
    Python序列内置类型之列表类型详解  1.Python序列概念     数学上,序列是被排成一列的对象(或事件)这样每个元素不是在其他元素之前,就是在其他元素之后。这里,元素之间的顺序非常重要。序列是Python中最基本的数据结构。...
    99+
    2023-01-30
    入门篇
  • Python_实用入门篇_07
    Python内置类型之数字类型以及Python之禅 1.数字类型概念     Python 数字数据类型用于存储数值,数据类型是不允许改变的,这就意味着如果改变数字数据类型的值,将重新分配内存空间。   看图,数字类型是不可变的,假设你...
    99+
    2023-01-30
    入门篇
  • Python_实用入门篇_12
    Python内置序列类型之集合类型详解    1.集合概念     具有某种特定性质的事物的总体,集合里的东西叫作元素。Python中,集合(set)是一个无序不重复元素的序列。   2.集合的创建     可以使用大括号 { } 或者...
    99+
    2023-01-30
    入门篇
  • Python_实用入门篇_11
    Python内置类型之字典类型详解 1.字典的概念     字典是一种通过名字或者关键字引用的得数据结构,其键可以是数字、字符串、元组,这种结构类型也称之为映射。字典类型是Python中唯一內建的映射类型。字典是另一种可变容器模型,且可...
    99+
    2023-01-30
    入门篇
  • Python_实用入门篇_13
    目前学习的Python基础的一次总结  一.列表,元组,集合,字典,字符 1.Python中最常见的序列类型为:列表,元组,字符类型 特点: ①所有序列都支持迭代 注意:generator也是可迭代对象,generator是生成器,后面...
    99+
    2023-01-30
    入门篇
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作