node.js面向对象实现(二)继承

2023-05-16

http://blog.sina.com.cn/s/blog_b5a53f2e0101nrdi.html


继承是面向对象中非常重要的一个概念,那么在Node.js中如何实现继承呢?
node.js在util中提供了inherits函数用于基于原型的继about:ntab承,实现如下:
node.js面向对象实现(二)继承
利用Object.create方法创建了一个具有指定原型的对象,并且指定的原型就是传入的父类参数的原型,所以大家普遍称这种方式为原型继承。

我们来尝试一下
baseClass内容:
node.js面向对象实现(二)继承

extendClass内容:
node.js面向对象实现(二)继承

这样就实现了从Base到Extend的继承,是不是非常简单呢?我们来使用一下吧~~

调用:
node.js面向对象实现(二)继承

node.js面向对象实现(二)继承

奇怪的事情发生了!分别调用了父类的两种showName的方法,但是为什么第二种会报错呢?仔细看一下baseClass中的定义,可以发现:
(1) 定义在构造函数内部的方法
    this.showName = function()
    {
        console.log(this.name);
    };
(2) 原型方法
   Base.prototype.showName1 = function()
   {
      console.log(this.name1);
   };
node.js自带的inherits是无法继承非原型方法和属性的,也就是说在父类构造函数内部定义的方法和属性子类中都无法得到继承,只有父类中的原型方法和属性才可以被子类继承(其实从源代码中就可以看出,inherits方法其实只复制了原型链而已)。那么我们如何实现内建属性和方法的继承呢?

我们先来理解一下构造函数内建属性和方法的本质
    JS中this指针的本质是上下文对象的概念,其作用是在一个函数内部应用调用它对象的本身,那么我们只要将父类的上下文对象完全的复制给子类不就可以让子类调用父类构造函数中的内建属性和对象了嘛~~~
   JS非常强大可以使用Call方法来进行方法执行时上下文的替换,所以修改ExtendClass,在构造函数中增加一句神奇的代码:
node.js面向对象实现(二)继承
Base.call(this)的作用为
(1)在Extend中执行了Base的构造函数
(2)执行base构造函数的时候其实真正的上下文对象为Extend的上下文对象
所以可以理解为在Extend的上下文对象中创建了Base构造函数中的所有属性和方法(如果无法理解我说的,大家下个断点走一下就可以完全明白了)

现在我们再来执行一下之前的调用:
node.js面向对象实现(二)继承

可以看到我们即继承了base中的原型方法和属性,同时也可以访问到base的内建属性和方法了!!!
至此node.js面向对象中的继承就全部讲完啦~~~以上是node.js官方的继承方式,唯一的问题就是我们不但需要调用util.inherits来继承原型链,还需要调用父类的call来构造父类的内建方法和属性。

网上还流传着另外一种实现继承的方式,比官方的方法更为完善一些,而且只需要调用一行就可以了~~
如下图:
node.js面向对象实现(二)继承

这种方式可以同时继承父类的原型方法以及内建方法!还少了一句代码~~
其本质是将Extend的原型链连向Base的原型对象(new 方法的本质可以详见我上一篇文章)。至于这种方法有和不好。。还没有发现~~有待大牛指正~~

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

node.js面向对象实现(二)继承 的相关文章

  • Centos7部署Vue项目

    一 安装docker 1 安装依赖包 sudo yum install y yum utils device mapper persistent data lvm2 2 设置阿里云镜像源 sudo yum config manager ad
  • Chromium revision is not downloaded. Run "npm install"

    在使用依赖puppeteer的组件com时 使用npm install 安装组件 报错 Chromium revision is not downloaded Run npm install 解决思路 1 先安装 puppeteer 2 删
  • ‘“node --max-old-space-size=4096“‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。

    问题描述 使用npm run dev的时候报如下错误 node max old space size 4096 不是内部或外部命令 也不是可运行的程序或批处理文件 FATAL ERROR Ineffective mark compacts
  • 解决:Error [ERR_REQUIRE_ESM]: require() of ES Module C:\Users\辰之星\AppData\Roaming\npm\node_modules\n

    解决 Error ERR REQUIRE ESM require of ES Module C Users 辰之星 AppData Roaming npm node modules nrm node modules open index j
  • vue项目中使用http-proxy-middleware解决前端开发中跨域的问题

    使用方式 1 安装 npm install http proxy middleware save dev 2 使用 一般的使用 新建js文件 在此小编命名为proxy js const proxy require http proxy mi
  • Node.js 下载安装环境配置 - 图文版

    Node js 是一个开源 跨平台的 JavaScript 运行时环境 一 介绍 1 官方文档 1 中文文档 Node js 中文网 2 英文文档 Node js 二 下载 1 中文 2 英文 编辑三 安装 1 新建一个文件夹作为安装路径
  • node写可选参数接口

    个人网站 紫陌 笔记分享网 想寻找共同学习交流 共同成长的伙伴 请点击 前端学习交流群 今天写项目接口看到接口文档要求带四个参数两个参数必选两个可选 当时在想可选参数要怎么做 毕竟自己也没有写过 然后想了一天终于想出一个感觉不是最佳的方案
  • mongodb 关于 整数类型 和 字符串类型 索引的比较

    想看看到底是 整数类型的索引快呢 还是字符串类型的索引快 到底快多少呢 内存分别占多少呢 今天就来测试一下 配置 华硕飞行堡垒6 500G 的 SSD 准备数据 a 是 for 循环的变量 id a name abcdefg a 2千万的数
  • npm 实现原理

    输入 npm install 命令并敲下回车后 会经历如下几个阶段 以 npm 5 5 1 为例 1 执行工程自身 preinstall 当前 npm 工程如果定义了 preinstall 钩子此时会被执行 2 确定首层依赖模块 首先需要做
  • Angular --官方文档使用 Angular CLI创建项目

    1 在node环境下 标配 node v npm v 指令在命令窗口查看两个的版本号 node高于6 9 3 npm版本高于3 0 0 如果你是新安装的话 就不要考虑这个问题了 2 全局安装 Angular CLI npm install
  • Nginx常用命令以及升级(window)

    nginx Windows作为标准控制台应用程序 不是服务 运行 可以使用以下命令对其进行管理 start nginx 启动Nginx nginx s stop fast shutdown 快速停止 nginx s quit gracefu
  • npm指令执行前执行自定义代码

    1 基本逻辑 npm start执行前执行node bin wb handle scripts wb node bin wb handle npm start wb handle源码 删除deleteNodeModules配置的最后一级目录
  • npm、yarn、pnpm如何清除缓存?

    前端工程化创建项目会经常使用各种安装包管理工具 安装各种前端依赖包 例如 npm yarn pnpm等 时间一长 各种安装包管理工具的在安装依赖时 留下的缓存文件就会变得很大 以至于影响系统的运行 因此必要时清除缓存就是一个不错的选择 本文
  • 初识pnpm

    初识pnpm 介绍 pnpm和npm yarn一样 都是包管理器 但是pnpm节约磁盘空间并且安装很快 所有的报会存储在硬盘的同一个位置 多个项目使用了同一个包时 在pnpm中他们是公用的 只会存储一遍 下次需要用到这个包时就会从硬盘中查找
  • 使用Koa2进行Web开发(二)静态文件与路由

    静态文件处理 这里选择koa static作为处理静态文件的中间件 const Koa require koa const app new Koa const serve require koa static app use serve d
  • 解决node.js+MYSQL读/写date类型数据有异样,且相差8个小时的问题

    既将读 写格式为 2021 05 04T16 00 00 000Z 的数据 转换为本地日期时间 2021 05 05 格式 一 读取异样处理 例如 在数据库中date类型数据原本为 2021 05 05 但是直接打印出来确是下面这样 dat
  • express脚手架安装和使用,node添加跨域处理

    前言 node的脚手架 express generator 的安装和使用 安装 步骤一 全局安装脚手架 npm i express generator g cnpm i express generator g 可以运行命令 express
  • nvm安装(Windows篇)

    nvm node version manager node版本管理工具 通过将多个node 版本安装在指定路径 然后通过 nvm 命令切换时 就会切换我们环境变量中 node 命令指定的实际执行的软件路径 使用场景 比如我们手上同时在做好几
  • Node.js爬虫实战:百度图片爬取

    说在前面 网络爬虫是一种自动化工具 能够模拟人类在互联网上浏览和提取信息的行为 它的应用范围广泛 包括数据采集 信息监控 搜索引擎优化等方面 而在数据抓取和处理中 获取图片资源往往是一个常见的需求 本文将介绍如何使用Node js和相关库构
  • 精品Nodejs实现的“音乐盒”小程序的设计与实现-音乐播放器歌曲

    含文档 PPT 源码等 精品Nodejs实现的 音乐盒 小程序的设计与实现 包运行成功 该项目含有源码 文档 PPT 配套开发软件 软件安装教程 项目发布教程 包运行成功 软件开发环境及开发工具 操作系统 Windows 10 Window

随机推荐

  • app后端设计(4)-- 通讯的安全性

    在app 的后台设计中 xff0c 一个很重要的因素是考虑通讯的安全性 因此 xff0c 我们需要考虑的要点有 xff1a 1 在app 和后台 xff0c 都不能保存任何用户密码的明文 2 在app 和后台通讯的过程中 xff0c 怎么保
  • app后端设计(5)-- 表情的处理

    在app 的应用中 xff0c 文字中夹带表情是个很常见 xff0c 那么 xff0c 在后台处理表情的时间 xff0c 我遇到过下面两个问题 xff1a 1 表情在mysql 的存储 表情的utf8 编码 xff0c 有时是有4 个字节的
  • app后端设计(6)-- LBS

    在LBS的应用中 xff0c 一个基本的需求是查找附近的用户 xff0c 现在有两种做法 xff1a 1 使用mysql的空间数据库 xff0c 具体做法参考 xff1a http blog sina com cn s blog a48af
  • app后端设计--总目录

    做了3年app相关的系统架构 xff0c api设计 xff0c 先后在3个创业公司中工作 xff0c 经历过手机网页端 xff0c android客户端 xff0c iphone客户端 xff0c 现就职于app云后端平台bmob xff
  • app后端设计(7)-- 项目管理

    移动互联网行业是个快速发展的行业 xff0c 需求不断变化 xff0c 产品更新快 基于移动互联网的以上特点 xff0c 在开发产品的过程中 xff0c 我们放弃了传统的瀑布流开发模型 xff0c 引入了精益的理念和scrum 这个敏捷开发
  • app后端设计(8)-- 数据库分表

    当项目上线后 xff0c 随着用户的增长 xff0c 有些数据表的规模会以几何级增长 xff0c 当数据达到一定规模的时候 xff08 例如100万条 xff09 xff0c 查询 xff0c 读取性能就下降得很厉害 xff0c 这时 xf
  • app后端设计(9)-- 动态通知

    在app中 xff0c 例如在通知界面 xff0c 当新通知的时候 xff0c 需要显示有多少条通知 xff0c 用户点击 获取新通知 后 xff0c 就能看到新的通知 那么在app端 xff0c 怎么才能知道有多少条新通知 xff1f 实
  • app后端设计(10)--数据增量更新

    在新浪微博的app中 xff0c 从别的页面进入主页 xff0c 在没有网络的情况下 xff0c 首页中的已经收到的微博还是能显示的 xff0c 这显然是把相关的数据存储在app本地 使用数据的app本地存储 xff0c 能减少网络的流量
  • app后端设计(11)-- 系统架构(2014.12.05更新)

    个人认为 xff0c 在小型的创业团队中 xff0c 特别是以应用产品为主 xff0c 在架构后台的时候 xff0c 需要集中精力解决自身业务上的问题 xff0c 不是花时间解决第三方已经解决的问题 xff0c 简单点来说 xff0c 就是
  • 多机器人集群网络通信协议分析

    本文讨论的是多机器人网络通信各层的情况和协议 每个机器人连接一个数据传输通信模块 xff08 以下简称为数传 xff0c 也泛指市面上的图传或图数一体的通信模块 xff09 xff0c 数传之间进行组网来传递信息 根据ISO的划分 xff0
  • Nginx多虚拟主机下泛域名配置

    http www tuicool com articles F3Azuq 近上一个应用 xff0c 让用户可以自定义二级域名 xff0c 所以要配置一个泛域名来解析用户的自定义域名 首先来说说nginx下的泛域名配置 xff0c nginx
  • PHP集成支付宝快速实现充值功能

    http blog lixiphp com php alipay fast chongzhi axzz2wy4huhBm 本文将介绍如何快速通过PHP类库来集成 整合支付宝来实现充值功能 如果你的系统想要扩充积分 账户余额等功能 xff0c
  • 分布式定时任务框架——python定时任务框架APScheduler扩展

    http bbs 7boo org forum php mod 61 viewthread amp tid 61 14546 如果将定时任务部署在一台服务器上 xff0c 那么这个定时任务就是整个系统的单点 xff0c 这台服务器出现故障的
  • yii批量插入的方法

    code style margin 0px padding 0px border 0px font family none span class kwd style margin 0px padding 0px border 0px spa
  • MongoDB之DBref(关联插入,查询,删除) 实例深入

    http blog csdn net crazyjixiang article details 6668288 suppose I have the following datastructure var user 61 id 39 foo
  • MongoDB基本使用

    http www cnblogs com TankMa archive 2011 06 08 2074947 html 成功启动MongoDB后 xff0c 再打开一个命令行窗口输入mongo xff0c 就可以进行数据库的一些操作 输入h
  • 一个靠谱的phpredisadmin文件

    http download csdn net detail newjueqi 7227487
  • CORS(跨域资源共享) 的配置

    http blog csdn net ohyoyo2014 article details 24863197 兼容情况 xff1a 各种新版本的ie10 firefox opera safari chrome以及移动版safari和andr
  • Go调用C代码,Cgo札记

    http www myexception cn program 679738 html Go调用C代码 xff0c Cgo笔记 参考 xff1a 官方文档 xff1a http golang org cmd cgo http blog go
  • node.js面向对象实现(二)继承

    http blog sina com cn s blog b5a53f2e0101nrdi html 继承是面向对象中非常重要的一个概念 xff0c 那么在Node js中如何实现继承呢 xff1f node js在util中提供了inhe