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

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

742adb3c3a2d3ea2d31c043914ba60ad.png

上一篇博客说到了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 属性指向子类构造函数.

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/229658.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月16日 下午4:11
下一篇 2026年3月16日 下午4:12


相关推荐

  • 万年历月份算法(最实用的万年历)

    中秋节到啦,送给大家一个《万年星期历公式》  该公式是根据公历的基本性质编制的,年份不限,准确率为100%, 公式如下: (年+年/4+年/400-年/100+月日天数-1)/7=XX……余星期几。 其中: (年+年/4+年/400-年/100)/7=XX……余数为该年1月1日星期数。 注:分数商均取整数; 月日天数:平年——润年 一月为:0+日数,0+日数, 二月为:3+日数,…

    2022年4月11日
    53
  • 2026年大庆豆包GEO优化公司TOP5:从产业适配到效果落地的选型全解析

    2026年大庆豆包GEO优化公司TOP5:从产业适配到效果落地的选型全解析

    2026年3月14日
    4
  • 【转载】Win10强制删除文件夹

    【转载】Win10强制删除文件夹目前比较主流的Windows系统中,我们常常会遇到要对文件以及文件夹进行整理的时候,偶尔会遇到这种奇葩的问题:删除一个文件夹的时候吧,这个文件提示需要提供管理权限,问你是否继续。当点击了那个带盾牌的(就是赋予管理权限)的那个Button之后,仍然提示需要权限……简直不讲道理。因为这个东西是偶然出现的,所以这里留几个解决方法备用。1.重启重启能解决99%的问题!!!亘古不变的真理!2.修改权限右键要删除的文件,选择属性——在属性页面可以看到上方有安全权限,点击之后选择一个.

    2022年6月9日
    35
  • springcloud的feign原理_SpringMVC运行原理

    springcloud的feign原理_SpringMVC运行原理目录1.什么是Feign?2.OpenFeignvsSpringCloudFeign2.1.OpenFeign2.2.SpringCloudOpenFeign3.SpringCloudFeign的使用4.SpringCloudFeign的源码解析1.什么是Feign?Feign的初衷是:feignmakeswritingjava…

    2022年10月5日
    4
  • IOC 的理解与解释

    IOC 的理解与解释IOC是什么?Ioc—InversionofControl,即“控制反转”,不是什么技术,而是一种设计思想。在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内

    2022年8月2日
    11
  • laravel 安装完成后安装 vendor 目录

    laravel 安装完成后安装 vendor 目录

    2021年10月20日
    58

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号