跟我一块儿学NodeJS,基础篇(四)

因为工做缘由,小编将近一周没写文章了,在这里给你们道个歉。在上一篇的内容里,小编介绍了关于网络请求和响应的详细使用方法,今天小编和你们聊一聊NodeJS中类的概念,以及如何实现继承关系,最后介绍下NodeJS中经常使用的一些设计模式。 


模块与类所谓的模块,就是程序设计中,为了完成某一功能所需的一段程序或子程序;或指能由编译程序、装配程序等处理的独立程序单位;或指大型软件系统中的一部分。 
在NodeJS中能够理解为为完成某一功能所需的程序或子程序,同时也能够将NodeJS的一个模块理解为一个“类”,须要注意的是自己并不是是类,而只是简单意义上的一个对象,该对象能够拥有多个方法和属性,例如咱们新建一个module.JS,例以下面代码所示:前端

.==.=(itemName){
    (!itemName){
        ()
    }{
        (itemName)}
}
.=(){
    .()}
(myname){
    =myname}
代码说明
  • exports.name:模块的公有属性 name
  • var myName:模块的私有属性 myname
  • exports.init:模块公有方法 init
  • exports.show:模块公有方法show
  • function setName(myName):模块私有方法 setName

通常来讲 exports 和 module.exports 的成员为公有成员,而非exports 和 module.exports的成员为私有成员。web


接下来咱们新建一个showModule.js的文件来验证咱们的结论。 编程

=().(.).().().(.myname)

获取Person对象,输出相关的公有成员,而后在测试下私有成员myname是否能够调用,执行完showModule.js后,返回结果以下: 
设计模式

结果中第一行输出的是公有变量name,其次执行init初始化和show方法输出结果,最后输出Person的私有变量未定义。最后强调一下,NodeJS模块不是类。
NodeJS中的继承继承的方法主要经过NodeJS的 unit 模块 inherits API 来实现继承(util.inherits(constructor, superConstructor)),将一个构造函数的原型方法继承到另外一个构造函数中。constructor构造函数的原型设置为使用superConstructor构造函数所建立的一个新对象。

下面咱们来查看官网的例子,其目的的使用 MyStream 继承 events.EventEmitter 对象。示例代码以下:网络

= ()= ()() {
    .()}

.()..= (data) {
    .(data)}= ().().(.super_ === ).(() => {
    console.log(`Received data: `)}).()
代码说明


  • function Mystream(){}: 目的是使用MyStrem 来继承  events.EventEmitter 的方法属性;
  • MyStream.prototype.write():为MyStream添加方法;
  • var stream=new Mystream():建立Mystream对象;
  • console.log(stream instanceof EventEmitter):判断是否继承events.EventEmitter;
  • console.log(MyStream.super_ === EventEmitter):经过super_获取父类对象;
  • stream.on():调用继承来自 events.EventEmitter 的方法。

下面小编带着你们亲自完成一个继承实例,例如学生继承人这个类,首先咱们来建立一个Person的基类,示例代码以下:app

.=(){
    .=.=(){
        .()}
    .=(){
        .()}
}

接下来咱们建立一个student类继承person类,且是一个动态的student类,代码以下:ide

=()=()(){
    .call()}
.()..=(){
    .()}
.=

最后咱们在app.js在引用person,student类,同时调用自身特有的方法,代码以下:函数

=()=()=()=().().().().().().().().().()

运行app.js,从下图的运行结果咱们成功的实现了类的继承关系。学习



接下来,你会问小编,如何重写父类的方法,那就须要在子类的方法中添加被继承类的方法,如建立overload.js,代码以下: 测试

=()=()(){
    .call().=(){
        .()}
}

.().=

在上面的例子中,咱们都是经过new的方法动态调用student方法,有没有使用静态的方法进行调用呢,就无需咱们每次调用时,new一个对象了,答案确定是的有,具体代码以下:

=()=()(){
    .call().().=(){
        .()}
}
=().=..=..=.

而后咱们新建一个appstatic.js文件,经过静态的方法调用刚才改写的方法 ,具体代码以下:

=().().().()

这样调用是否是特别简单呢,这样作的好处使咱们能够避免代码的冗余。固然不是全部的类能够这样调用,若是每次new一个对象都须要初始一些变量的值,小编建议选择使用动态建立的方法。

接下来小编给你们一块儿了解经常使用的设计模式:单例模式、适配器模式、工厂模式 。


单例模式单例模式就比如之前的计划生育,只能生一个(如今能生两个了,你们放心的生吧,嘿嘿!),说专业点就是保证一个实例,并提供一个访问它的全局访问点。
一般咱们可让一个全局变量让一个对象进行调用,但它不能防止你实例多个对象。一个最好的办法就是,让类自身负责保存它的惟一实例。这个类能够保证没有其余实例能够被建立,而且它能够提供一个访问该实例的方法。具体思路请参照下图:

NodeJS中利用模块实现单例模式的方法和上述思想一致,下面咱们来建立一个single_class.js方法实现单例模式,代码以下:

=.=(name){
    (name){
        .=name.=.=}
    .={
        ::(){
            .(+.++.++.)}

    }
    .=(){
        (===){
            =(name)
        }
        }
}

接下来,咱们建立single_App.js来验证是否实现了单例模式,代码以下:

=()=()=.().()singleObj2=Single()singleClass2=singleObj2.getInstance()singleClass2.show()
接下来咱们运行相关代码
从运行结果能够看出,咱们的单例模式奏效了,传递不一样的名称,singleObj2的名称没法覆盖singleObj1,主要是单例模式判断是否new了新对象,因此显示的都是前端达人。 
适配器模式何为适配器模式,如今里约奥运会如火如荼,若是你有幸现场观看节目,是否是想身边有一个翻译,说通俗一点,你在哪看比赛,你身边的翻译就能把结果翻译成你能懂的中文,说专业点就是将一个类的接口转换成客户但愿的另一个接口。适配器模式使得本来因为接口不兼容而不能一块儿工做的那些类能够一块儿工做。

依据上图,咱们一块儿建立三个类,Target,Adapter和Adaptee。Adapter 调用 Adaptee中方法的具体实现。建立一个Target类,其中包含request方法,代码以下:

.=(){
    .=(){
        .()}
}

建立Adaptee类,实现specialRequest方法,代码以下

.=(){
    .=(){
        .()}
}

建立Adapter(适配器)类,继承Target类,并重写其request方法,代码以下:

=()=()=()(){
    .call().=(){
        =().()}
}
.().=

最后咱们建立脚本client.js调用适配器中request的方法,代码以下:

=()=().()
执行完client.js返回结果以下:


从运行结果能够看出,适配器调用了Adaptee 中的 specialRequest 方法,这样就实现了NodeJS编程下的适配器模式。 


工厂模式定义一个用于建立对象的接口,让子类决定将哪个类实例化。工厂模式使一个类的实例化延迟到其子类。工厂模式的示意图以下: 图片接下来,小编带着你们一块儿来实现上图的思想,建立一个Product基类,同时添加getProduct方法,代码以下:
.=(){
    .=(){
        .()}
}
建立两个继承于product类 的ProductA 类和 ProductB 类 ,代码以下:
=()=()(){
    .call().=(){
        .()}
}
.().=
productA 和 productB 实现方法是同样的,小编就不在这里啰嗦了。接下来经过productFactory 来建立工厂对象,根据不一样的参数获取不一样的参数对象,具体的代码以下:
=()=().=(type){
    (type){
        : 
            ():
        :
            ()}
}
建立client.js, 使用productFactory来调用creatProduct 建立Product对象,具体代码以下:
=()=.().()=.().()
运行Client.js的结果以下图 : 图片从结果能够看出经过传递不一样的字符串,分别获取了ProductA 和 ProductB,这样咱们轻松完成了一个简单的工厂模式。

图片关于今天的内容小编就介绍到这里,咱们学习了在NodeJS中的对象、类和模块的区别和联系,以及类之间的继承关系如何实现,以及一些经常使用的设计模式。想必你们的收获是满满的,接下来的内容小编将带着你们一块儿学习下web开发中经常使用的一些基础概念、方法和技巧。
相关文章
相关标签/搜索