浅谈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中的fiber(纤程)库详解
Mar 24 NodeJs
NodeJs中的VM模块详解
May 06 NodeJs
NodeJS创建基础应用并应用模板引擎
Apr 12 NodeJs
Nodejs抓取html页面内容(推荐)
Aug 11 NodeJs
nodejs搭建本地http服务器教程
Mar 13 NodeJs
对mac下nodejs 更新到最新版本的最新方法(推荐)
May 17 NodeJs
详解webpack打包nodejs项目(前端代码)
Sep 19 NodeJs
Nodejs实现多文件夹文件同步
Oct 17 NodeJs
搭建一个nodejs脚手架的方法步骤
Jun 28 NodeJs
nodejs和react实现即时通讯简易聊天室功能
Aug 21 NodeJs
NodeJS 文件夹拷贝以及删除功能
Sep 03 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
冰滴咖啡制作步骤
2021/03/03 冲泡冲煮
改进的IP计数器
2006/10/09 PHP
PHP中几种常见的超时处理全面总结
2012/09/11 PHP
使用php检测用户当前使用的浏览器是否为IE浏览器
2013/12/03 PHP
解析PHP强制转换类型及远程管理插件的安全隐患
2014/06/30 PHP
php实现的递归提成方案实例
2015/11/14 PHP
Linux下快速搭建php开发环境
2017/03/13 PHP
js下通过prototype扩展实现indexOf的代码
2010/12/08 Javascript
javascript动态加载三
2012/08/22 Javascript
jquery.cookie.js使用指南
2015/01/05 Javascript
html的DOM中Event对象onabort事件用法实例
2015/01/21 Javascript
JQuery.Ajax()的data参数类型实例详解
2015/11/20 Javascript
jquery树形菜单效果的简单实例
2016/06/06 Javascript
jQuery 3.0 的 setter和getter 模式详解
2016/07/11 Javascript
AngularJS教程之简单应用程序示例
2016/08/16 Javascript
Bootstrap Table使用心得总结
2016/11/29 Javascript
jQuery上传插件webupload使用方法
2017/08/01 jQuery
微信小程序开发教程之增加mixin扩展
2017/08/09 Javascript
微信小程序实现刷脸登录
2018/05/25 Javascript
JavaScript Math对象和调试程序的方法分析
2019/05/13 Javascript
JQuery实现ul中添加LI和删除指定的Li元素功能完整示例
2019/10/16 jQuery
vue渲染方式render和template的区别
2020/06/05 Javascript
[53:03]Optic vs TNC 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
Python实现向服务器请求压缩数据及解压缩数据的方法示例
2017/06/09 Python
基于Python数据分析之pandas统计分析
2020/03/03 Python
python破解同事的压缩包密码
2020/10/14 Python
Python实现京东抢秒杀功能
2021/01/25 Python
HTML5 Notification(桌面提醒)功能使用实例
2014/03/17 HTML / CSS
Holiday Inn中国官网:IHG旗下假日酒店预订
2018/04/08 全球购物
小学生家长评语集锦
2014/01/30 职场文书
《生命的药方》教学反思
2014/04/08 职场文书
师德师风演讲稿
2014/05/05 职场文书
缓刑期间思想汇报范文
2014/10/10 职场文书
离婚协议书应该怎么写
2014/10/12 职场文书
干部培训简讯
2015/07/20 职场文书
Python趣味挑战之给幼儿园弟弟生成1000道算术题
2021/05/28 Python