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

发布时间 - 2026-01-11 02:30:57    点击率:

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.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  # 继承  # 类继承  # Js类的构建与继承案例详解  # js类的继承定义与用法分析  # ES6 javascript中Class类继承用法实例详解  # js中实现多态采用和继承类似的方法  # JS继承--原型链继承和类式继承  # JavaScript 高级篇之闭包、模拟类  # 继承(五)  # JavaScript类和继承 this属性使用说明  # javascript类继承机制的原理分析  # javascript类继承的实现方法  # 子类  # 就能  # 老样子  # 象中  # 要有  # 适用于  # 请在  # 这句话  # 到你  # 什么呢  # 看一下  # 则会  # 先来  # 中不  # 大家多多  # 是一门  # 出现错误  # 测试一下  # 这也是  # 未来 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何在Windows 2008云服务器安全搭建网站?  大学网站设计制作软件有哪些,如何将网站制作成自己app?  Gemini手机端怎么发图片_Gemini手机端发图方法【步骤】  如何在 Pandas 中基于一列条件计算另一列的分组均值  Win10如何卸载预装Edge扩展_Win10卸载Edge扩展教程【方法】  用v-html解决Vue.js渲染中html标签不被解析的问题  Laravel的.env文件有什么用_Laravel环境变量配置与管理详解  如何在阿里云通过域名搭建网站?  WordPress 子目录安装中正确处理脚本路径的完整指南  Midjourney怎么调整光影效果_Midjourney光影调整方法【指南】  Laravel怎么配置S3云存储驱动_Laravel集成阿里云OSS或AWS S3存储桶【教程】  Claude怎样写约束型提示词_Claude约束提示词写法【教程】  Laravel怎么进行数据库事务处理_Laravel DB Facade事务操作确保数据一致性  uc浏览器二维码扫描入口_uc浏览器扫码功能使用地址  Win11怎么关闭透明效果_Windows11辅助功能视觉效果设置  Android利用动画实现背景逐渐变暗  js实现点击每个li节点,都弹出其文本值及修改  通义万相免费版怎么用_通义万相免费版使用方法详细指南【教程】  高防服务器如何保障网站安全无虞?  Laravel如何使用Gate和Policy进行权限控制_Laravel权限判定与策略规则配置  怎么用AI帮你为初创公司进行市场定位分析?  Angular 表单中正确绑定输入值以确保提交与验证正常工作  油猴 教程,油猴搜脚本为什么会网页无法显示?  Laravel如何处理表单验证?(Requests代码示例)  Python函数文档自动校验_规范解析【教程】  高端智能建站公司优选:品牌定制与SEO优化一站式服务  海南网站制作公司有哪些,海口网是哪家的?  laravel怎么为API路由添加签名中间件保护_laravel API路由签名中间件保护方法  php后缀怎么变mp4格式错误_修改扩展名提示格式不对怎么办【技巧】  Laravel模型事件有哪些_Laravel Model Event生命周期详解  JavaScript数据类型有哪些_如何准确判断一个变量的类型  如何在云指建站中生成FTP站点?  如何在云服务器上快速搭建个人网站?  php485函数参数是什么意思_php485各参数详细说明【介绍】  Windows Hello人脸识别突然无法使用  Laravel怎么实现模型属性的自动加密  EditPlus中的正则表达式 实战(1)  Laravel如何生成和使用数据填充?(Seeder和Factory示例)  Python文件流缓冲机制_IO性能解析【教程】  Windows10电脑怎么设置虚拟光驱_Win10右键装载ISO镜像文件  如何为不同团队 ID 动态生成多个非值班状态按钮  Edge浏览器如何截图和滚动截图_微软Edge网页捕获功能使用教程【技巧】  Laravel怎么在Blade中安全地输出原始HTML内容  iOS UIView常见属性方法小结  个人网站制作流程图片大全,个人网站如何注销?  大连网站制作公司哪家好一点,大连买房网站哪个好?  如何获取PHP WAP自助建站系统源码?  轻松掌握MySQL函数中的last_insert_id()  Laravel如何实现多表关联模型定义_Laravel多对多关系及中间表数据存取【方法】  微信小程序 wx.uploadFile无法上传解决办法