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

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 方法的本质可以详见我上一篇文章)。至于这种方法有和不好。。还没有发现~~有待大牛指正~~

原文地址:https://www.cnblogs.com/dingxiaoyue/p/4926795.html