浅谈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访问ActiveX对象,以操作Access数据库为例。
Dec 15 NodeJs
NodeJS学习笔记之(Url,QueryString,Path)模块
Jan 13 NodeJs
详解Nodejs基于mongoose模块的增删改查的操作
Dec 21 NodeJs
nodejs 实现钉钉ISV接入的加密解密方法
Jan 16 NodeJs
用nodejs搭建websocket服务器
Jan 23 NodeJs
Nodejs 获取时间加手机标识的32位标识实现代码
Mar 07 NodeJs
nodejs+websocket实时聊天系统改进版
May 18 NodeJs
mac下的nodejs环境安装的步骤
May 24 NodeJs
nodejs body-parser 解析post数据实例
Jul 26 NodeJs
nodejs创建简易web服务器与文件读写的实例
Sep 07 NodeJs
NodeJS安装图文教程
Apr 19 NodeJs
nodejs脚本centos开机启动实操方法
Mar 04 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
用Apache反向代理设置对外的WWW和文件服务器
2006/10/09 PHP
Http 1.1 Etag 与 Last-Modified提高php效率
2008/01/10 PHP
PHP实现的函数重载功能示例
2018/08/03 PHP
关于Yii2框架跑脚本时内存泄漏问题的分析与解决
2019/12/01 PHP
超级兔子让浮动层消失的前因后果
2007/03/09 Javascript
jquery 学习之二 属性相关
2010/11/23 Javascript
js变量以及其作用域详解
2020/07/18 Javascript
js jquery数组介绍
2012/07/15 Javascript
extjs关于treePanel+chekBox全部选中以及清空选中问题探讨
2013/04/02 Javascript
javascript中直接写php代码的方法
2013/07/31 Javascript
jQuery插件kinMaxShow扩展效果用法实例
2015/05/04 Javascript
详解javascript实现自定义事件
2016/01/19 Javascript
js获取鼠标点击的对象,点击另一个按钮删除该对象的实现代码
2016/05/13 Javascript
js删除Array数组中指定元素的两种方法
2016/08/03 Javascript
jQuery+CSS3实现四种应用广泛的导航条制作实例详解
2016/09/17 Javascript
基于JQuery的购物车添加删除以及结算功能示例
2017/03/08 Javascript
vue组件初学_弹射小球(实例讲解)
2017/09/06 Javascript
解决Vue 给mapState中定义的属性赋值报错的问题
2020/06/22 Javascript
解决vue字符串换行问题(绝对管用)
2020/08/06 Javascript
python清除指定目录内所有文件中script的方法
2015/06/30 Python
如何利用python制作时间戳转换工具详解
2018/09/12 Python
基于Python实现剪切板实时监控方法解析
2019/09/11 Python
Python中six模块基础用法
2019/12/08 Python
python对数组进行排序,并输出排序后对应的索引值方式
2020/02/28 Python
Python pip install如何修改默认下载路径
2020/04/29 Python
python SOCKET编程基础入门
2021/02/27 Python
学习雷锋演讲稿
2014/05/10 职场文书
工商局领导班子存在的问题整改措施思想汇报
2014/10/05 职场文书
教师师德师风整改措施
2014/10/24 职场文书
2015年元旦晚会活动总结(学生会)
2014/11/28 职场文书
行为规范主题班会
2015/08/13 职场文书
早安问候语大全
2015/11/10 职场文书
《有余数的除法》教学反思
2016/02/22 职场文书
浅谈node.js中间件有哪些类型
2021/04/29 Javascript
Python语言中的数据类型-序列
2022/02/24 Python
Win10开机修复磁盘错误怎么跳过?Win10关闭开机磁盘检查的方法
2022/09/23 数码科技