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


Posted in NodeJs onJuly 26, 2017

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方法,该方法在基类原型对象中实现。

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

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

出现错误,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(子类,父类) 进行父类成员函数的继承

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

NodeJs 相关文章推荐
利用NodeJS的子进程(child_process)调用系统命令的方法分享
Jun 05 NodeJs
NodeJS整合银联网关支付(DEMO)
Nov 09 NodeJs
NodeJs测试框架Mocha的安装与使用
Mar 28 NodeJs
nodejs body-parser 解析post数据实例
Jul 26 NodeJs
nodejs前端自动化构建环境的搭建
Jul 26 NodeJs
nodejs 简单实现动态html的方法
May 12 NodeJs
CentOS7中源码编译安装NodeJS的完整步骤
Oct 13 NodeJs
Nodejs中怎么实现函数的串行执行
Mar 02 NodeJs
使用nodejs分离html文件里的js和css详解
Apr 12 NodeJs
NodeJs生成sitemap站点地图的方法示例
Jun 11 NodeJs
nodejs实现百度舆情接口应用示例
Feb 07 NodeJs
NodeJS模块Buffer原理及使用方法解析
Nov 11 NodeJs
nodejs之get/post请求的几种方式小结
Jul 26 #NodeJs
nodejs前端自动化构建环境的搭建
Jul 26 #NodeJs
nodejs body-parser 解析post数据实例
Jul 26 #NodeJs
深入解析nodejs HTTP服务
Jul 25 #NodeJs
NodeJS使用七牛云存储上传文件的方法
Jul 24 #NodeJs
nodejs 搭建简易服务器的图文教程(推荐)
Jul 18 #NodeJs
nodejs密码加密中生成随机数的实例代码
Jul 17 #NodeJs
You might like
php购物车实现代码
2011/10/10 PHP
PHP判断网络文件是否存在的方法
2015/03/12 PHP
PHP处理postfix邮件内容的方法
2015/06/16 PHP
微信公众平台开发(五) 天气预报功能开发
2016/12/03 PHP
php解析base64数据生成图片的方法
2016/12/06 PHP
Laravel统计一段时间间隔的数据方法
2019/10/09 PHP
使用prototype.js进行异步操作
2007/02/07 Javascript
JQuery DataTable删除行后的页面更新利用Ajax解决
2013/05/17 Javascript
Jquery设置attr的disabled属性控制某行显示或者隐藏
2014/09/25 Javascript
多个jQuery版本共存的处理方案
2015/03/17 Javascript
nodejs中实现阻塞实例
2015/03/24 NodeJs
JavaScript实现彩虹文字效果的方法
2015/04/16 Javascript
js判断当前页面在移动设备还是在PC端中打开
2016/01/06 Javascript
JavaScript数组和对象的复制
2017/03/21 Javascript
Vue-cli@3.0 插件系统简析
2018/09/05 Javascript
[05:01]3.19DOTA2发布会 我们都是刀塔人
2014/03/25 DOTA
[08:56]DOTA2-DPC中国联赛2月23日Recap集锦
2021/03/11 DOTA
Python正则表达式的使用范例详解
2014/08/08 Python
python中管道用法入门实例
2015/06/04 Python
如何使用七牛Python SDK写一个同步脚本及使用教程
2015/08/23 Python
python正则分析nginx的访问日志
2017/01/17 Python
使用Python的turtle模块画图的方法
2017/11/15 Python
Jupyter notebook 启动闪退问题的解决
2020/04/13 Python
python matplotlib库的基本使用
2020/09/23 Python
销售类个人求职信范文
2013/09/25 职场文书
医院办公室主任职责
2013/12/29 职场文书
初婚未育证明
2014/01/15 职场文书
工程技术员岗位职责
2014/03/02 职场文书
岗位廉洁从政承诺书
2014/03/27 职场文书
《画杨桃》教学反思
2014/04/13 职场文书
中等生评语大全
2014/05/04 职场文书
工商干部先进事迹
2014/05/14 职场文书
2015年简历自我评价范文
2015/03/11 职场文书
六一儿童节新闻稿
2015/07/17 职场文书
保险公司增员口号
2015/12/25 职场文书
React实现动效弹窗组件
2021/06/21 Javascript