Node.js 原型链

util核心模块(require(“utils"))提供了一个创建函数原型链。该函数称为 inherits ,并采用一个子类继之以父类。

  1. var inherits = require("util").inherits;
  2. function Car(n){
  3. this.name = n;
  4. }
  5. Car.prototype.drive= function (destination) {
  6. console.log(this.name, "can drive to", destination);
  7. }
  8. function FlyingCar(name) {
  9. // Call parent constructor
  10. Car.call(this, name);
  11. // Additional construction code
  12. }
  13. inherits(FlyingCar, Car);
  14. // Additional member functions
  15. FlyingCar.prototype.fly = function (destination) {
  16. console.log(this.name, "can fly to", destination);
  17. }
  18. var bird = new FlyingCar("XXX");
  19. bird.drive("New York");
  20. bird.fly("Seattle");

上面的代码生成以下结果。

inherits函数结果

覆盖子类中的函数

要覆盖父函数但仍使用一些原始功能,只需执行以下操作:

在子原型上创建一个具有相同名称的函数。调用父函数类似于我们调用父构造函数的方法,基本上使用

  1. Parent.prototype.memberfunction.call(this, /*any original args*/) syntax.
  1. // util function
  2. var inherits = require("util").inherits;
  3. // Base
  4. function Base() {
  5. this.message = "message";
  6. };
  7. Base.prototype.foo = function () {
  8. return this.message + " base foo"
  9. };
  10. // Child
  11. function Child() { Base.call(this); };
  12. inherits(Child, Base);
  13. // Overide parent behaviour in child
  14. Child.prototype.foo = function () {
  15. // Call base implementation + customize
  16. return Base.prototype.foo.call(this) + " child foo";
  17. }
  18. // Test:
  19. var child = new Child();
  20. console.log(child.foo()); // message base foo child foo

上面的代码生成以下结果。

覆盖结果

检查继承链

  1. var inherits = require("util").inherits;
  2. function A() { }
  3. function B() { }; inherits(B, A);
  4. function C() { }
  5. var b = new B();
  6. console.log(b instanceof B); // true because b.__proto__ == B.prototype
  7. console.log(b instanceof A); // true because b.__proto__.__proto__ == A.prototype
  8. console.log(b instanceof C); // false