当前位置:首页 > 日记 > 正文

浅谈nodejs中的类定义和继承的套路

浅谈nodejs中的类定义和继承的套路

javascript是一门极其灵活的语言。

灵活到你无法忍受!

我个人喜欢强类型的语言,例如c/c++,c#等。

但是js代表着未来,所以需要学习。

js中类定义以及继承有n多种方式,现在来学习一下nodejs类定义以及继承的固定套路。

套路1. 在构造函数(constructor)中总是使用instanceof操作符:

function Base() {  if (!(this instanceof Base)) {    return new Base();  }}

上述代码的含义就是: 如果Base这个函数调用时没有使用new操作符,则会自动调用new操作符,返回Base的实例

套路2. 所有成员变量定义在构造函数(constructor)中

function Base() {  if (!(this instanceof Base)) {    return new Base();  }  //开始成员变量定义  this.className = "Base";}

套路3. 所有的成员方法以函数表达式方式定义在原型(prototype)中【为什么要这样,其原因在套路4中的inherits源码注释中】

Base.prototype.printClassName = function(){   console.log(this.className);}

调用如下:

var base = Base(); //不使用new操作符,直接进行函数调用,自动调用new操作符console.log(base.className);base.printClassName();

套路4. 使用util.inherits(子类,父类)进行原型(prototype)继承

先来看一下inherits的源码:

var inherits = function(ctor, superCtor) {  //严格相等测试:undefined/null  //子类构造函数必须存在  if (ctor === undefined || ctor === null)    throw new TypeError('The constructor to "inherits" must not be ' +      'null or undefined');  //严格相等测试:undefined/null  //父类构造函数必须存在  if (superCtor === undefined || superCtor === null)    throw new TypeError('The super constructor to "inherits" must not ' +      'be null or undefined');  //要点: 如果要继承的话,父类必须要有prototype对象  //这也是为什么将所有成员方法都定义在prototype对象中!!!  if (superCtor.prototype === undefined)    throw new TypeError('The super constructor to "inherits" must ' +      'have a prototype');  //让子类构造函数对象增加一个super_指针,指向父类,这样就形成继承链  ctor.super_ = superCtor;  //调用Object.setPrototypeOf(子类的prototype,父类的prototype)  Object.setPrototypeOf(ctor.prototype, superCtor.prototype);};

Object.setPrototypeOf : 该链接可以了解一下setPrototypeOf方法,非常简单,其Polyfill如下:

// 仅适用于Chrome和FireFox,在IE中不工作:Object.setPrototypeOf = Object.setPrototypeOf || function (obj, proto) { obj.__proto__ = proto; return obj; }

我们来测试一下继承。

先定义子类

function Child() {  //老样子,套路1  if (!(this instanceof Child)) {    return new Child();  }}

然后根据套路4, 调用inherits函数进行原型继承

//注意,inherits调用不在构造函数,也不在原型对象,而是全局调用inherits(Child, Base);

最后我们调用一下child的printClassName方法,该方法在基类原型对象中实现。

子类调用基类函数-undefined.webp

出现错误,child.printClassName()后输出undefined!

为什么呢?

套路5. 子类的构造函数中使用 父类.call(this),实现父类构造函数中的成员变量继承

function Child() {  //老样子,套路1  if (!(this instanceof Child)) {    return new Child();  }  //增加这句话,在调用printClassName就能正常的输出Base字符串  Base.call(this);  //如果要更新基类的成员变量,请在Base.call(this)之后!  this._className = "Child"; //调用printClassName就能正常的输出Child字符串}

Function.prototype.call()

由此可见,nodejs中的继承需要:

在构造函数中调用 父类.call(this),实现父类成员变量的继承

全局调用inherits(子类,父类) 进行父类成员函数的继承

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

相关文章

Asp.net 中使用GridView控件实现Ch

Asp.net 中使用GridView控件实现Ch

单选,控件,电脑软件,net,Asp,在GridView控件中,第0列有放一个CheckBox控件,现想实现对CheckBox进行单选。先看看效果:在ASPX页面,可以这样做:有一点注意的是需要使用OnRowCreated事件。在ASPX.cs代码里,实现上面OnRowCreated事件:上面有个事件委托…

IE11下使用canvas.toDataURL报Secu

IE11下使用canvas.toDataURL报Secu

解决方法,错误,电脑软件,canvas,SecurityError,发现问题最近在项目中用到了 canvas 的 toDataURL 方法来获取图片的 base64 格式数据,用以上传到后台。由于之前也遇到过 canvas 被跨域图片污染不能获取数据的坑,因此这回一开始就机智的把 cro…

excel表格统计数据教程

excel表格统计数据教程

教程,统计数据,表格,电脑软件,excel,  Excel中数据该如何统计呢?接下来是小编为大家带来的excel表格统计数据教程,供大家参考。excel表格统计数据教程:  统计数据步骤1:菜单栏——公式(03版的是在数据里面可以找到)—&mdas…

Word2003如何做电子报

Word2003如何做电子报

方法,板报,如何做,电子报,电脑软件,  利用word2003制作电子板报前,要思考主题,收集素材,之后进行制作。那么大家知道怎样做电子报吗?下面是小编给大家整理的一些有关word2003制作电子板报的方法,希望看完本教程的朋友都能学会Word技巧并运用起…

excel2007使用时卡顿的解决方法exc

excel2007使用时卡顿的解决方法exc

解决方法,电脑软件,时卡顿,strong,  Microsoft Office Excel 2007 打开 Excel 2003 创建的文件在筛选时出现卡顿,要等待几分钟甚至更长时间才会响应,今天,小编就教大家如何解决卡顿的方法。Excel2007使用时卡顿的解决方法excel2007使用时卡…

Asp.net Core 1.1 升级后操作mysql

Asp.net Core 1.1 升级后操作mysql

操作,升级,解决办法,电脑软件,net,遇到问题core的版本从1.0升级到1.1,操作mysql数据库,查询数据时遇到MissingMethodException问题,更新、插入操作没有问题。如果你也遇到这个问题,请参照以下步骤进行升级操作。操作步骤及内容如果你的项目已经…

ASP.NET Core 2.0 本地文件操作问

ASP.NET Core 2.0 本地文件操作问

操作,解决方案,本地文件,电脑软件,NET,问题如何在ASP.NET Core 2.0中受限地访问本地目录和文件信息?答案新建一个空项目,修改Startup类,添加访问本地文件所需的服务:public void ConfigureServices(IServiceCollection services){ services.Add…

AI如何使用黄金比例绘制鲸鱼logo?

AI如何使用黄金比例绘制鲸鱼logo?

绘制,黄金,鲸鱼,如何使用,比例,版权申明:本文原创作者“格律设计”,感谢“格律设计”的原创经验分享!最近,很多网友问小编ai怎么做黄金比例lo?接下来小编就给大家分享AI使用黄金比例绘制鲸鱼lo的方法?教程难度不大,主要介绍运…

让div运动起来 js实现缓动效果

让div运动起来 js实现缓动效果

缓动,运动,效果,电脑软件,div,本文实例为大家分享了js实现缓动效果的具体代码,供大家参考,具体内容如下var tween = { linear:function(t,b,c,d){ return c*t/d + b; }, easeIn:function(t,b,c,d){ return c * ( t /= d ) * t + b; …

excel表格的筛选数字范围的教程

excel表格的筛选数字范围的教程

数字,教程,筛选,表格,电脑软件,  Excel中的筛选功能可以筛选数据,具体该如何筛选数字范围呢?下面是小编带来的关于excel表格的筛选数字范围的教程,希望阅读过后对你有所启发!excel表格的筛选数字范围的教程:  筛选数字范围步骤1:选中当前列…

Javascript设计模式之装饰者模式详

Javascript设计模式之装饰者模式详

设计模式,装饰者模式,详解,电脑软件,Javascript,一、前言:装饰者模式(Decorator Pattern):在不改变原类和继承的情况下动态扩展对象功能,通过包装一个对象来实现一个新的具有原对象相同接口的新的对象。装饰者模式的特点:1. 在不改变原对象的原本…

excel2007设置共享模式的方法excel

excel2007设置共享模式的方法excel

模式,设置,方法,如何设置,电脑软件,  Excel中经常需要使用到共享模式进行多人录入,共享模式具体该如何设置出来呢?下面是由小编分享的excel2007设置共享模式的方法,以供大家阅读和学习。excel2007设置共享模式的方法设置共享模式步骤1:首先…