覆盖util.format影响util。(其他)

时间:2018-02-21 14:47:08

标签: node.js

探索NodeJS ..

BaseClass.js:

const util = require("util");

class BaseClass {
    constructor() {
        this.util = util;
        this.init();
    }
    init() {
        console.log( util.format( "%s", "baseclass format" ) );
        console.log( util.isArray( [1,2,3] ) );
        util.log( "baseclass log" );
    }
}

module.exports = BaseClass;

SubClass.js:

const BaseClass = require("./BaseClass");

class SubClass extends BaseClass {
    constructor() {
        super();
    }
    init() {
        this.util.format = function() { return "subclass format"; }
        this.util.isArray = function() { return "subclass isArray"; }
        this.util.log = function() { console.log( "subclass log" ); }
        super.init();
    }
}

new SubClass();

输出(node SubClass.js):

subclass format
subclass format
subclass format

嗯。在SubClass.js中注释掉util.format覆盖:

// this.util.format = function() { return "subclass format"; }

再试一次。输出(node SubClass.js):

baseclass format
subclass isArray
subclass log

有人能告诉我为什么会这样吗?我已经猜到isArraylog在util模块中调用了format,但我不确定在哪里验证这一点。 node_modules/node/index.d.ts并没有真正启发我。

1 个答案:

答案 0 :(得分:2)

你的直觉是正确的。最简单的验证方法是the docs for console.log(强调我的):

  

console.log([data] [,... args])

     

添加于:v0.1.100

     
      
  • data <any>
  •   
  • ...args <any>
  •   
     

使用换行符打印到stdout。可以传递多个参数,第一个用作主要消息,所有其他参数用作类似于printf(3)的替换值(参数全部传递给util.format() )。

在Node.js源代码中,您可以在lib/console.js(第140行)中查看这种情况。

在您的代码中,this.util是对require('util')返回的对象的引用,因此当您替换this.util.format时,您将替换所有代码,而不仅仅是代码中的代码类。