node.js面向对象实现(二)继承
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面向对象实现(二)继承的更多相关文章
- node.js 初学(二)—— 搭建注册/登录服务器
node.js 初学(二)—— 搭建注册/登录服务器 理论上来说,代码实现在理论和实际上是一样的.但实际上来说,他们不是 做一个最简单的用户注册登录功能 1.接口定义: 注册:/user?act=re ...
- 进击Node.js基础(二)
一.一个牛逼闪闪的知识点Promise npm install bluebird 二.Promise实例 ball.html <!doctype> <!DOCTYPE html> ...
- JS面向对象笔记二
菜单导航,<JS面向对象笔记一>, 参考书籍:阮一峰之<JavaScript标准参考教程> 一.构造函数和new命令 二.this关键字 三.构造函数和new命令 四.构造函 ...
- node.js学习(二)--Node.js控制台(REPL)&&Node.js的基础和语法
1.1.2 Node.js控制台(REPL) Node.js也有自己的虚拟的运行环境:REPL. 我们可以使用它来执行任何的Node.js或者javascript代码.还可以引入模块和使用文件系统. ...
- Node.js基础学习二之POST请求
本篇介绍下 Node.js post 请求 需求: 用户登录,前端界面输入用户名和密码,点击登录请求后台验证,根据后台反馈的信息做出响应 前端: (1)使用form表单 (2)使用ajax异步请求 服 ...
- Node.js之Express二
好久没写了,今天看博客,觉得有必要把node.js继续写完,善始善终.原本想着把小崔课堂继续讲下去,由于其他原因也就此耽搁下来,看看以后还有没有机会吧.废话不扯,123开始. 一.Exoress之Re ...
- Node.js文件操作二
前面的博客 Node.js文件操作一中主要是对文件的读写操作,其实还有文件这块还有一些其他操作. 一.验证文件path是否正确(系统是如下定义的) fs.exists = function(path, ...
- node js学习(二)——REPL(交互式解释器)
1.简介 Node.js REPL(Read Eval Print Loop:交互式解释器) 表示一个电脑的环境,类似 Window 系统的终端或 Unix/Linux shell,我们可以在终端中输 ...
- Node.js 学习(二) 创建第一个应用
如果我们使用PHP来编写后端的代码时,需要Apache 或者 Nginx 的HTTP 服务器,并配上 mod_php5 模块和php-cgi. 从这个角度看,整个"接收 HTTP 请求并提供 ...
随机推荐
- iOS多线程篇:NSThread简单介绍和使用
一.什么是NSThread NSThread是基于线程使用,轻量级的多线程编程方法(相对GCD和NSOperation),一个NSThread对象代表一个线程, 需要手动管理线程的生命周期,处理线程同 ...
- 如何让minicom换行
以前在使用minicom验证裸板代码的时候,经常会遇到以下这个问题: 通常一直打数据往后打就只能打一行,然后就不能换行了,遇到这个问题如何解决? 看到屏幕下方提示:CTRL-A Z for hel ...
- How tomcat works 读书笔记十二 StandardContext 下
对重载的支持 tomcat里容器对重载功能的支持是依靠Load的(在目前就是WebLoader).当在绑定载入器的容器时 public void setContainer(Container cont ...
- LeetCode之旅(21)-Swap Nodes in Pairs
题目: Given a linked list, swap every two adjacent nodes and return its head. For example, Given 1-> ...
- pyqt5 动画在QThread线程中无法运行问题
自己做了一个tcp工具,在学习动画的时候踩了坑,需求是根据上线变绿色,离线变灰色,如果连接断开了,则变为灰色 问题现象: 可以看到点击"连接","离线"的时候动 ...
- angularjs系列之轻松使用$q进行异步编程
第一部分关于js中的异步编程 异步编程简单的说就是你写了一段代码,但他不会按照你书写代码的顺序立即执行,而是等到程序中发生了某个事件(如用户点击了某个按钮,某个ajax请求得到了响应)才去执行这段代码 ...
- 开源一个IE下获取XPath小工具,支持32/64位
背景是曾经友情支持了测试组一小段时间,发现他们使用selenium做页面的自动化测试,需要用到XPath,但IE下没有获取XPath的工具,只能在Firefox和chrome下获取,步骤还比较麻烦.而 ...
- DB2常用命令小结
PS:执行命令前需要进入DB2的账户下:su db2inst1 修改密码:更改相应的操作系统密码即可,windows上可以更改db2admin的密码,linux上更改db2inst1的密码即可,db2 ...
- VS报错 error LNK2005: _DllMain@12 已经在 MSVCRTD.lib(dllmain.obj) 中定义
链接报错: 错误 33 error LNK2005: _DllMain@12 已经在 MSVCRTD.lib(dllmain.obj) 中定义 E:\客户问题\w_王鹏\EventLibTest_Ti ...
- sql server 多行数据合并成一列
首先是源数据: ),cip.CheckIn_StartTime, )),cip.CheckIn_EndTime, )),cip.Rental_Price)) as content from Check ...