由于工作原因,小编将近一周没写文章了,在这里给大家道个歉。在上一篇的内容里,小编介绍了关于网络请求和响应的详细使用方法,今天小编和大家聊一聊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的成员为私有成员。


接下来我们新建一个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的基类,示例代码如下:

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

接下来我们创建一个student类继承person类,且是一个动态的student类,代码如下:

=()=()(){
    .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编程下的适配器模式。 


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

跟我一起学NodeJS,基础篇(四)_java_03关于今天的内容小编就介绍到这里,我们学习了在NodeJS中的对象、类和模块的区别和联系,以及类之间的继承关系如何实现,以及一些常用的设计模式。想必大家的收获是满满的,接下来的内容小编将带着大家一起学习下web开发中常用的一些基础概念、方法和技巧。