探索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
有人能告诉我为什么会这样吗?我已经猜到isArray
和log
在util模块中调用了format
,但我不确定在哪里验证这一点。 node_modules/node/index.d.ts
并没有真正启发我。
答案 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
时,您将替换所有代码,而不仅仅是代码中的代码类。