node.js 下使用 util.inherits 来实现继承
上一篇博客说到了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 来实现继承的更多相关文章
- Node.js 常用工具 util
util 是一个Node.js 核心模块,提供常用函数的集合,用于弥补核心JavaScript 的功能 过于精简的不足. util.inherits util.inherits(constructor ...
- Node.js 常用工具util
util 是一个Node.js 核心模块,提供常用函数的集合,用于弥补核心JavaScript 的功能 过于精简的不足. util.inherits util.inherits(constructor ...
- Node.js 常用工具util包
Node.js 常用工具 util 是一个Node.js 核心模块,提供常用函数的集合,用于弥补核心JavaScript 的功能 过于精简的不足. util.isError(obj); util.is ...
- 31.Node.js 常用工具 util
转自:http://www.runoob.com/nodejs/nodejs-module-system.html util 是一个Node.js 核心模块,提供常用函数的集合,用于弥补核心JavaS ...
- node.js 下依赖Express 实现post 4种方式提交参数
上面这个图好有意思啊,哈哈, v8威武啊.... 在2014年的最后一天和大家分享关于node.js 如何提交4种格式的post数据. 上上一篇说到了关于http协议里定义的4种常见数据的post方法 ...
- npm 是node.js下带的一个包管理工具
npm 是node.js下带的一个包管理工具 npm install -g webpack webpack是一个打包工具 gulp是一个基于流的构建工具,相对其他构件工具来说,更简洁 ...
- node.js下操作cookie
cookie,又是cookie.工作中与cookie打交道很多次,不过时间跨度也大,每总结多一次,就加深了解多一点. cookie,一定是放在浏览器中的,用于浏览器保存一些小额度的内容.每次我们去访问 ...
- node.js下使用RSA加密事例(windows)
1.安装openss 直接下载window下的安装包 http://houjixin.blog.163.com/blog/static/3562841020144143494875/ 以我发博文现在的 ...
- Node.js下的Hello World
Node.js技术现在可谓是如火如荼,前后端都统一为Javascript的体验绝对是受到了很多人的青睐,我都后悔以前没抽时间好好学一学Javascript了. 首先,我来介绍一下Node.js.本人实 ...
随机推荐
- java在window系统的一些问题
一般的, 在windows cmd上启动 utf-8编码的java应用 会有一些字符集问题 可以修改cmd的字符集编码为utf8 , chcp 65001 java -D有空格时 区别: VM参数是 ...
- $.extend({},defaults, options)
1.$.extend({},defaults, options) 这样做的目的是为了保护包默认参数.也就是defaults里面的参数. 做法是将一个新的空对象({})做为$.extend的第一个参数, ...
- JS时间控件 moment.js用法
参考http://momentjs.cn/ 下载 moment.js moment.min.js 12.4k moment+多语言支持.js moment+多语言支持.min.js 45.4k 安装 ...
- ES6数组新增方法总结
关于数组中forEach() .map().filter().reduce().some().every()的总结 let arr = [1, 2, 3, 4, 5] // forEach遍历数组 a ...
- Android官方架构组件介绍之应用(四)
讲一个项目常见的功能,友盟统计功能 例如一个项目有很多多modlue,每个里面modlue都有Activity,Activity需要友盟统一,Fragment也需要友盟统计.一般做法就是继承一个Bas ...
- 2019.03.20 读书笔记 as is 以及重写隐式/显示
强转.as is 的用法 强制转换类型有两种:子类转基类,重写隐式(implicit )\显示(explicit) 转换操作符 class myclass { private int value; p ...
- 解决ajax提交中文数据乱码
function replaceWord(date,wordurl){ $.ajax({ url : 'wordReplace', ...
- Linux环境常用命令
bash host #查看IP对应机器名 hostname #查看本机名 hostname –i #查看本机IP mssh ...
- Mac使用zsh导致maven命令无效的解决方案
第一步: vim ~/.zshrc 第二步:在.zshrc末尾加上 source ~/.bash_profile: 保存推出了 第三步 source ~/.bash_profile
- MATLAB矩阵操作和算术运算符
矩阵的表示 矩阵之间用空格或者是逗号间隔 矩阵可以拼接(可以用矩阵拼接) 实部矩阵和虚部矩阵构成复数矩阵,一一对应. 冒号表达式: 格式: e1:e2:e3 e1表示初始值 e2表示步长 e ...