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

继承是面向对象中非常重要的一个概念,那么在Node.js中如何实现继承呢?

node.js在util中提供了inherits函数用于基于原型的继about:ntab承,实现如下:



利用Object.create方法创建了一个具有指定原型的对象,并且指定的原型就是传入的父类参数的原型,所以大家普遍称这种方式为原型继承。



我们来尝试一下

baseClass内容:





extendClass内容:





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



调用:









奇怪的事情发生了!分别调用了父类的两种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,在构造函数中增加一句神奇的代码:



Base.call(this)的作用为

(1)在Extend中执行了Base的构造函数

(2)执行base构造函数的时候其实真正的上下文对象为Extend的上下文对象

所以可以理解为在Extend的上下文对象中创建了Base构造函数中的所有属性和方法(如果无法理解我说的,大家下个断点走一下就可以完全明白了)



现在我们再来执行一下之前的调用:





可以看到我们即继承了base中的原型方法和属性,同时也可以访问到base的内建属性和方法了!!!

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



网上还流传着另外一种实现继承的方式,比官方的方法更为完善一些,而且只需要调用一行就可以了~~

如下图:





这种方式可以同时继承父类的原型方法以及内建方法!还少了一句代码~~

其本质是将Extend的原型链连向Base的原型对象(new 方法的本质可以详见我上一篇文章)。至于这种方法有和不好。。还没有发现~~有待大牛指正~~

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

  1. node.js 初学(二)—— 搭建注册/登录服务器

    node.js 初学(二)—— 搭建注册/登录服务器 理论上来说,代码实现在理论和实际上是一样的.但实际上来说,他们不是 做一个最简单的用户注册登录功能 1.接口定义: 注册:/user?act=re ...

  2. 进击Node.js基础(二)

    一.一个牛逼闪闪的知识点Promise npm install bluebird 二.Promise实例 ball.html <!doctype> <!DOCTYPE html> ...

  3. JS面向对象笔记二

    菜单导航,<JS面向对象笔记一>,  参考书籍:阮一峰之<JavaScript标准参考教程> 一.构造函数和new命令 二.this关键字 三.构造函数和new命令 四.构造函 ...

  4. node.js学习(二)--Node.js控制台(REPL)&&Node.js的基础和语法

    1.1.2 Node.js控制台(REPL) Node.js也有自己的虚拟的运行环境:REPL. 我们可以使用它来执行任何的Node.js或者javascript代码.还可以引入模块和使用文件系统. ...

  5. Node.js基础学习二之POST请求

    本篇介绍下 Node.js post 请求 需求: 用户登录,前端界面输入用户名和密码,点击登录请求后台验证,根据后台反馈的信息做出响应 前端: (1)使用form表单 (2)使用ajax异步请求 服 ...

  6. Node.js之Express二

    好久没写了,今天看博客,觉得有必要把node.js继续写完,善始善终.原本想着把小崔课堂继续讲下去,由于其他原因也就此耽搁下来,看看以后还有没有机会吧.废话不扯,123开始. 一.Exoress之Re ...

  7. Node.js文件操作二

    前面的博客 Node.js文件操作一中主要是对文件的读写操作,其实还有文件这块还有一些其他操作. 一.验证文件path是否正确(系统是如下定义的) fs.exists = function(path, ...

  8. node js学习(二)——REPL(交互式解释器)

    1.简介 Node.js REPL(Read Eval Print Loop:交互式解释器) 表示一个电脑的环境,类似 Window 系统的终端或 Unix/Linux shell,我们可以在终端中输 ...

  9. Node.js 学习(二) 创建第一个应用

    如果我们使用PHP来编写后端的代码时,需要Apache 或者 Nginx 的HTTP 服务器,并配上 mod_php5 模块和php-cgi. 从这个角度看,整个"接收 HTTP 请求并提供 ...

随机推荐

  1. 面试之路(13)-android apk之间共享数据的方式以及shareUserId详解

    1.通过content Provider/sharedPreferrence 2.通过shareUserId 我们详细介绍一下shareUserId: Android App Sandbox(andr ...

  2. nasm汇编一些需要注意的地方

    经常用msam或tasm的童鞋一下转换到nasm下可能觉得不怎么适应,它们应该先去晓习一下gas的语法,然后就适应了-that's only a joke! :) section .data v101 ...

  3. mybatis中autoCommit自动提交事务

    今天学习了下mybatis, 对其中的autoCommit自动提交事务比较好奇, 研究了下,把配置和代码都放上 mapper.xml如下: <?xml version="1.0&quo ...

  4. Javac的实现过程

    主要介绍Javac的实现过程及原理. 首先弄明白什么是Javac? Javac是一种编译器,将一种语言转换为另一种语言规范.编译器的作用就是将符合java语言规范的源代码转化为JVM虚拟机能够识别的字 ...

  5. MySQL运维工具

    Mysql运维过程中设计的各类工具以及各个场景的的命令行的分类.大体总结如下的xmind图片(.xmind附件 加 Q1123654342). 大体上分为: 实例管理工具.高可用工具.慢日志查询工具. ...

  6. 详解k8s组件Ingress边缘路由器并落地到微服务 - kubernetes

    写在前面 Ingress 英文翻译 进入;进入权;进食,更准确的讲就是入口,即外部流量进入k8s集群必经之口.这到大门到底有什么作用?我们如何使用Ingress?k8s又是如何进行服务发现的呢?先看一 ...

  7. Python-网站页面代码获取

    Python3.6 库:urllib3, bs4 主程序是抓取亚马逊图书销售排名数据,但是亚马逊应该是加了反爬虫,拒绝疑似机器人的请求,这部分暂时以百度代替. 其实简单的页面抓取,常用的urllib. ...

  8. Android反编译和再打包神器:Apktool

    首先推荐一下这东东,官网:https://ibotpeaches.github.io/Apktool/ 安装.使用之类的看官方文档吧,写这个博客主要是mark一下这东西. 这玩意只能供打包党来用,要想 ...

  9. 终端字形logo

    网上有很多的项目都有一个自己的字形logo,而我也在开发一个小的项目,也想要生成一个终端字形的logo,于是找到这款小工具,分享给大家:FIGlet “FIGlet is a program for ...

  10. SQL转化为MapReduce的过程

    转载:http://www.cnblogs.com/yaojingang/p/5446310.html 在了解了MapReduce实现SQL基本操作之后,我们来看看Hive是如何将SQL转化为MapR ...