浅谈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 文本操作模块-fs模块(一)
Dec 22 NodeJs
nodejs利用http模块实现银行卡所属银行查询和骚扰电话验证示例
Dec 30 NodeJs
nodejs中使用HTTP分块响应和定时器示例代码
Mar 19 NodeJs
nodejs模块nodemailer基本使用-邮件发送示例(支持附件)
Mar 28 NodeJs
nodejs爬虫遇到的乱码问题汇总
Apr 07 NodeJs
详解nodejs微信公众号开发——4.自动回复各种消息
Apr 11 NodeJs
nodejs判断文件、文件夹是否存在及删除的方法
Nov 10 NodeJs
nodejs实现超简单生成二维码的方法
Mar 17 NodeJs
nodejs 生成和导出 word的实例代码
Jul 31 NodeJs
nodejs各种姿势断点调试的方法
Jun 18 NodeJs
Nodejs在局域网配置https访问的实现方法
Oct 17 NodeJs
node快速搭建后台的实现步骤
Feb 18 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改进计算字符串相似度的函数similar_text()、levenshtein()
2014/10/27 PHP
使用php的HTTP请求的库Requests实现美女图片墙
2015/02/22 PHP
微信支付开发交易通知实例
2016/07/12 PHP
thinkPHP的表达式查询用法详解
2016/09/14 PHP
Laravel中使用Queue的最基本操作教程
2017/12/27 PHP
PHP实现正则匹配所有括号中的内容
2018/06/22 PHP
JavaScript国旗变换效果代码
2008/08/13 Javascript
JavaScript获取GridView选择的行内容
2009/04/14 Javascript
jquery的键盘事件修改代码
2011/02/24 Javascript
jquery scrollTop方法根据滚动像素显示隐藏顶部导航条
2013/05/27 Javascript
jquery中交替点击事件toggle方法的使用示例
2013/12/08 Javascript
JS实现常见的TAB、弹出层效果(TAB标签,斑马线,遮罩层等)
2015/10/08 Javascript
jQuery实现复选框的全选和反选
2017/02/02 Javascript
AngularJS constant和value区别详解
2017/02/28 Javascript
js单页hash路由原理与应用实战详解
2017/08/14 Javascript
详解nodejs中express搭建权限管理系统
2017/09/15 NodeJs
浅谈vue项目4rs vue-router上线后history模式遇到的坑
2018/09/27 Javascript
微信小程序之下拉列表实现方法解析(附完整源码)
2019/08/23 Javascript
vue vantUI实现文件(图片、文档、视频、音频)上传(多文件)
2019/10/15 Javascript
mpvue实现左侧导航与右侧内容的联动
2019/10/21 Javascript
javascript实现贪吃蛇游戏(娱乐版)
2020/08/17 Javascript
python基于xml parse实现解析cdatasection数据
2014/09/30 Python
Python2.7.10以上pip更新及其他包的安装教程
2018/06/12 Python
Windows下Anaconda2安装NLTK教程
2018/09/19 Python
python pandas消除空值和空格以及 Nan数据替换方法
2018/10/30 Python
python执行scp命令拷贝文件及文件夹到远程主机的目录方法
2019/07/08 Python
python删除文件、清空目录的实现方法
2020/09/23 Python
美国东北部户外服装和设备零售商:Eastern Mountain Sports
2016/10/05 全球购物
Answear匈牙利:来自全球200多个知名时尚品牌
2017/04/21 全球购物
BCBG官网:BCBGMAXAZRIA
2017/12/29 全球购物
学前教育求职自荐信范文
2013/12/25 职场文书
二审代理词范文
2015/05/25 职场文书
2016中秋节问候语
2015/11/11 职场文书
2016秋季运动会前导词
2015/11/25 职场文书
MySQL 查询速度慢的原因
2021/05/25 MySQL
Python用tkinter实现自定义记事本的方法详解
2022/03/31 Python