解析Node.js实现对象继承的方法util.inherits()

 2015年12月10日    2487     声明


util.inherits()是Node.js工具类util提供的方法,该方法会将父类原型链上的方法复制到子类中,实现原型式继承。


1. util.inherits()语法结构

util.inherits(constructor, superConstructor)
  • constructor:子类的构造函数
  • superConstructor:父类的构造函数

示例:使用util.inherits()实现对象继承:

var util = require('util');

// 基类
function Site() {
  this.name = 'Site';
  this.domain = 'domain';
}

Site.prototype.create = function(name, domain) {
  this.name = name;
  this.domain = domain;
};

// 子类
function Itbilu() {
  Site.call(this); //调用基类的构造函数
}

// 继承父类
util.inherits(Itbilu, Site);

// 创建类实例
var itbilu = new Itbilu();

itbilu instanceof Site;  // true
tbilu instanceof Itbilu;  // true

itbilu.create('IT笔录', 'itbilu.com');
itbilu.name;    // 'IT笔录'
itbilu.domain;  // 'itbilu.com'


2. util.inherits()实现原理

util.inherits()方法对继承的实现,其本质上还是JavaScript原型链式继承。该方法会将父类superConstructor原型链上的方法复制到子类constructor原型链上,在其内部是调用Object.create()实现新对象的创建及原型链方法的复制。

util.inherits()内部实现如下:

exports.inherits = function(ctor, superCtor) {
  // 一些参数的合法性判断,略……

  ctor.super_ = superCtor;
  ctor.prototype = Object.create(superCtor.prototype, {
    constructor: {
      value: ctor,
      enumerable: false,
      writable: true,
      configurable: true
    }
  });
};

从以上实现代码可以看出,util.inherits()方法内部除调用Object.create()方法实现原型继承外,还将父类的构造函数写入到了子类的ctor.super_属性中,在使用中可以通过该属性方便调用到父类的构造函数。