上一篇博客说到了node.js继承events类实现事件发射和事件绑定函数,其中我们实现了一个公用基类 _base ,然后在模型中差异化的定义了各种业务需要的模型并继承 _base 公共基类.但是其中的继承是一笔带过,今天详细的说下node.js中继承.

var events=require('events');

var util=require('util');

function _base(){

this.emitter=new events.EventEmitter(this);

};

util.inherits(_base,events.EventEmitter); //继承

_base.prototype.onEvent=function(eventName,callback){

this.emitter.on(eventName,callback);

}

_base.prototype.emitEvent=function(eventName,arg){

this.emitter.emit(eventName,arg);

}

module.exports=_base;

util 包介绍:

node.js中的util核心包是node.js自带的核心代码,其完全用javascript代码实现,里面实现了一些常用的工具方法.

其中,我们今天要说的继承方法 inherites 就是util 核心包实现的一个api

util.inherits :util.inherits(constructor, superConstructor)

此方法有2个参数: 此方法参数针对的都是构造函数

constructor : 构造函数

superConstructor: 父类构造函数

分析最上面的代码:var events=require('events');

var util=require('util');

node.js 核心代码都包含上面的2个包,直接 require 引用即可

接下来是构造函数:function _base(){

this.emitter=new events.EventEmitter(this);

};

此构造函数里定义了一个私有变量 emitter ,细心的人应该发现此私有变量在下面的方法中用到了,为什么会这样,我们会再下一篇博客中来分析原型对象为何能共享构造函数中的私有变量.(此篇略过)

再下来是继承语法:util.inherits(_base,events.EventEmitter); //继承

inherits 把2个构造函数传入进去到底做了什么?

我们来看下 inherits 的源码:exports.inherits = function(ctor, superCtor) {

ctor.super_ = superCtor;

ctor.prototype = Object.create(superCtor.prototype, {

constructor: {

value: ctor,

enumerable: false,

writable: true,

configurable: true

}

});

};

在上面的代码中 ctor 想要继承 superCtor ,我们姑且把 ctor 称作子类, superCtor 称作父类.

ctor.super_= superCtor;

super_属性是子类继承父类时构造函数要写入的一个属性值.

ctor.prototype=Object.create(superCtor,prototype,{.....});

我们可以看到源码中子类原型指像父类原型对象.

当通过 new关键字创建子类对象时,子类原型对象上的属性都将会复制一份到子类对象中.就这样达到了继承的效果.

上面子类原型被Object.create() 方法赋值,那么我们再来看下 Object,create 是何方神圣.

Object.createObject.create(proto [, propertiesObject ])

作用:

通过指定的原型对象和属性创建一个新的对象.

proto 就是原型对象,

propertiesObject 就是指定的原型对象的属性,可选属性(非必填),如何理解这个参数?  它有4个属性,如下:var myBlog = Object.create({}, {'blog':{'value':'yijiebuyi', 'writable': false, 'enumerable': false, 'configurable': false}});

我们定义了一个 myBlog 对象引用

通过 Object,create 来赋值, 原型对象为 {}

propertiesObject 是对应的{'blog':{'value':'yijiebuyi', 'writable': false, 'enumerable': false, 'configurable': false}}value: 表示blog 的属性值;

writable: 表示blog 的属性值是否可写;[默认为: false]

enumerable: 表示属性blog 是否可以被枚举;[默认为: false]

configurable: 表示属性blog 是否可以被配置,例如 对obj.a做 delete操作是否允许;[默认为: false]

所以:create 函数实现原理就是 指定一个原型对象 obj ,然后把指定属性(及属性的配置)指到 原型对象下.

那么最后得到的 myblog 对象是这样的 {blog: "yijiebuyi"}

那我们知道了 util 中的 inherits 方法内部主要是调用了 Object.create来创建了一个新对象,新对象是基于父类原型对象 superCtor.prototype

另外一个属性是 constructor ,构造函数new出来的对象都有此属性,此属性值是指向了构造函数的引用.我们一般通过此属性可以得知这个对象是被谁new出来的.{

constructor: {

value: ctor,

enumerable: false,

writable: true,

configurable: true

}

}

如上代码就是定义了 contructor 属性,它的值是 ctor ,ctor是什么? 别忘了我们的初衷, ctor正是 inherits 函数传入的第一个参数,就是子类引用.

所以这个 create 函数创建了一个以父类原型对象为基础的新对象,同时把 contructor 属性指向子类构造函数.

java中的inherits_node.js 下使用 util.inherits 来实现继承相关推荐

  1. java 怎么调用js代码_在Java中直接调用js代码

    JDK1.6版添加了新的ScriptEngine类,允许用户直接执行js代码. 在Java中直接调用js代码 不能调用浏览器中定义的js函数,会抛出异常提示ReferenceError: " ...

  2. java中3des cbc,js與java通用的3DES(ECB,CBC)+Base64加密編碼,解碼解密

    J S端加密過程: key的處理: 通過創建指定的key,key必須是16位/24位/32位其中一種,但是常用的3DES加密的key為24位,下面使用的就是24位,key的長度可以隨意指定,在轉換ke ...

  3. Java中的多线程(下)

    目录 一.juc下的Lock 1.接口Lock 2.接口实现类--ReentrantLock类 2.1基本格式: 2.2其他方法的演示与区别 2.3 synchronized VS Reentrant ...

  4. Java中读取某个目录下的所有文件和文件夹

    import java.io.File; public class Test1 {public static void main(String[] args) {String path="d ...

  5. java中读取某路径下的文本内容

    path也就是文本存储的路径和文本名称,这个只是个人需要,一般的话,只需要在File file = new File(path);中把path替换成自己的路径就可以了,比如File file = ne ...

  6. java中的smm_smm框架下的JAVA玩友交流网站

    今天和一个朋友共同完成了一个玩友交流网站项目,我们在开发时选用的框架是SSM(MYECLIPSE)框架.我这个朋友知识有限,只会这个框架,哈哈,都是为了方便他.和往常一样选用简单又便捷的MYECLIP ...

  7. 如何在java中调用js方法

    [java] view plain copy/* * 加载脚本引擎,并在java中调用js方法 */ public void test2() { ScriptEngineManager manager ...

  8. java中调用js_java编程中实现调用js方法分析

    本文实例讲述了java编程中实现调用js方法.分享给大家供大家参考,具体如下: /* * 加载脚本引擎,并在java中调用js方法 */ public void test2() { ScriptEng ...

  9. js rsa java解密_RSA使用js加密,使用java解密

    RSA算法使用javascript加密,使用java解密,提供完整代码及例子下载. javascript加密介绍参见另一篇:javascript使用RSA加密提交数据.本篇的例子使用的js是上一篇中提 ...

最新文章

  1. 多场景下的AI疫情防控“天网”:解读云边端联动下的全栈AI技术
  2. html div中心显示,html中心div总是在中间,另外两个是动态的
  3. ssh命令、ping命令、traceroute 命令所使用的协议
  4. [linux命令技巧] mkdir -p
  5. php redis.h,swoole安装hredis支持导致php不能加载swoole扩展
  6. NOI数学:狄利克雷(Dirichlet)卷积
  7. How can I force Python's file.write() to use the same newline format in Windows as in Linux (“\r\n”
  8. Unable to read TLD META-INF/c.tld from JAR file
  9. Python 正则表达式模块 - re
  10. FISCO BCOS源码(2)启动顺序
  11. android View的层级结构
  12. 数据存储之SwiftJSON
  13. 面试官的窒息逼问: 到底什么是面向接口编程?
  14. 餐巾计划(网络流24题之二(模板2))
  15. 一款可自定义自动字典生成器---火花
  16. JUC之striped64
  17. telegram机器人开发3-最简单的代码
  18. JTopo添加动态连线
  19. 如何利用爬虫工具实现竞品价格监控
  20. 笨方法学python 习题9

热门文章

  1. matplotlib画图之设置横轴坐标上下限的两种方法
  2. Linux内存耗尽宕机6,转载:Linux服务器Cache占用过多内存导致系统内存不足最终java应用程序崩溃解决方案...
  3. 去ioe,什么是去IOE呢
  4. 不要打梦到的电话号码。。。
  5. RG120A-BB破解说明
  6. Ubuntu20.04安装配置tensorflow2深度学习环境
  7. 修改电脑分辨率后变得很模糊---怎么办?
  8. #论文阅读CTG The Use of Convolutional Neural Networks in Biomedical Data Processing
  9. 阿里云国际站服务器Linux系统磁盘管理怎么操作?
  10. 【身份证识别】基于matlab GUI身份证号码识别【含Matlab源码 014期】