上一篇博客说到了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.create

Object.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 属性指向子类构造函数.

node.js 下使用 util.inherits 来实现继承的更多相关文章

  1. Node.js 常用工具 util

    util 是一个Node.js 核心模块,提供常用函数的集合,用于弥补核心JavaScript 的功能 过于精简的不足. util.inherits util.inherits(constructor ...

  2. Node.js 常用工具util

    util 是一个Node.js 核心模块,提供常用函数的集合,用于弥补核心JavaScript 的功能 过于精简的不足. util.inherits util.inherits(constructor ...

  3. Node.js 常用工具util包

    Node.js 常用工具 util 是一个Node.js 核心模块,提供常用函数的集合,用于弥补核心JavaScript 的功能 过于精简的不足. util.isError(obj); util.is ...

  4. 31.Node.js 常用工具 util

    转自:http://www.runoob.com/nodejs/nodejs-module-system.html util 是一个Node.js 核心模块,提供常用函数的集合,用于弥补核心JavaS ...

  5. node.js 下依赖Express 实现post 4种方式提交参数

    上面这个图好有意思啊,哈哈, v8威武啊.... 在2014年的最后一天和大家分享关于node.js 如何提交4种格式的post数据. 上上一篇说到了关于http协议里定义的4种常见数据的post方法 ...

  6. npm 是node.js下带的一个包管理工具

    npm 是node.js下带的一个包管理工具          npm install -g webpack webpack是一个打包工具 gulp是一个基于流的构建工具,相对其他构件工具来说,更简洁 ...

  7. node.js下操作cookie

    cookie,又是cookie.工作中与cookie打交道很多次,不过时间跨度也大,每总结多一次,就加深了解多一点. cookie,一定是放在浏览器中的,用于浏览器保存一些小额度的内容.每次我们去访问 ...

  8. node.js下使用RSA加密事例(windows)

    1.安装openss 直接下载window下的安装包 http://houjixin.blog.163.com/blog/static/3562841020144143494875/ 以我发博文现在的 ...

  9. Node.js下的Hello World

    Node.js技术现在可谓是如火如荼,前后端都统一为Javascript的体验绝对是受到了很多人的青睐,我都后悔以前没抽时间好好学一学Javascript了. 首先,我来介绍一下Node.js.本人实 ...

随机推荐

  1. spring aop execution用法

    代码结构: 1. "execution(* com.ebc..*.*(..))" 与 "execution(*  com.ebc..*(..))" 2019-0 ...

  2. Web开发中FormData对象的使用

    参考: FormData 对象的使用 - Web API 接口 | MDN

  3. Java学习笔记day04_数组

    1.switch case switch语句中表达式的数据类型是有要求的: JDK 1.0 ~ 1.4 , 数据类型接受byte, short, int, char JDK 1.5 , 数据类型接受b ...

  4. 在Mac上配置iTerm2+Oh-My-Zsh&配置主题

    本教程基本完全按照iTerm2 + Oh My Zsh 打造舒适终端体验配置 但是个人感觉博主的颜色搭配不合理,体现在补全命令的字体不清晰,提示命令与背景颜色太过相近 所以,再此之后使用了Bullet ...

  5. $('#').formValidation校验网址

    $('#addCarouselInfoForm').formValidation({ message: '格式不正确', //不忽略隐藏域验证 excluded: [], icon: { valid: ...

  6. Murano Weekly Meeting 2015.11.11

    Meeting time: 2015.November.11th 1:00~2:00 Chairperson:  Serg Melikyan, PTL from Mirantis Meeting su ...

  7. 什么是JavaScript Souce Map

    第一部分 我们经常可以看到后缀名为.map的文件,比如我们下载得到bootstrap的css文件,如下所示: 不难理解bootstrap.css. bootstrap.min.css.等这些常规的代码 ...

  8. Linux Bird

    o / : 2GB o /boot: 200MB o /usr : 4GB o /var : 2GB o /tmp : 1GB o swap : 1GB o /home: 5GB,并且使用 LVM 模 ...

  9. SQL DATEDIFF语法及时间函数 Sql 查询当天、本周、本月记录

    SQL DATEDIFF语法及时间函数 Sql 查询当天.本周.本月记录 转:http://blog.csdn.net/Json1204/article/details/7863801?locatio ...

  10. 错误提示”void is an invalid type for the variable“

    今晚做android作业,出现错误提示:void is an invalid type for the variable, invalid:无效的  variable:变量,在网上找了一下后知道是 方 ...