1.轮回题目
当轮回挪用 require() 时,一个模块可能在未完成执行时被返回。
比方以下状况:
a.js:
exports.done = false;
const b = require('./b.js');
console.log('在 a 中,b.done = %j', b.done);
exports.done = true;
console.log('a 完毕');
b.js:
console.log('b 最先');
exports.done = false;
const a = require('./a.js');
console.log('在 b 中,a.done = %j', a.done);
exports.done = true;
console.log('b 完毕');
main.js:
console.log('main 最先');
const a = require('./a.js');
const b = require('./b.js');
console.log('在 main 中,a.done=%j,b.done=%j', a.done, b.done);
当 main.js 加载 a.js 时,a.js 又加载 b.js。 此时,b.js 会尝试去加载 a.js。 为了防备无穷的轮回,会返回一个 a.js 的 exports 对象的 未完成的副本 给 b.js 模块。 然后 b.js 完成加载,并将 exports 对象供应给 a.js 模块。
当 main.js 加载这两个模块时,它们都已完成加载。 因而,该顺序的输出会是:
$ node main.js
main 最先
a 最先
b 最先
在 b 中,a.done = false
b 完毕
在 a 中,b.done = true
a 完毕
在 main 中,a.done=true,b.done=true
须要细致的计划, 以许可轮回模块依靠在应用顺序内平常事情.
2.原型继续题目
须要注重的是call、apply、bind要领都只能继续对象的要领,却不能对它们的原型举行拷贝或继续,为此我们平常运用夹杂的写法,运用原型链和(apply或许call)要领举行继续。
而在nodeJS中,util包供应了一个要领util.inherits(constructor, superConstructor)
所以就得以下,经由过程连系运用call和inherits才将其完整拷贝:
function Girl(name){
this.name = name;
EventEmitter.call(this);
}
util.inherits(Girl,EventEmitter);
var girl = new Girl();
注重,不发起运用 util.inherits()。 请运用 ES6 的 class 和 extends 关键词取得言语层面的继续支撑。 注重,这两种体式格局是语义上不兼容的。
constructor <Function>
superConstructor <Function>
从一个组织函数中继续原型要领到另一个。 constructor 的原型会被设置到一个从 superConstructor 建立的新对象上。
superConstructor 可经由过程 constructor.super_ 属性接见。
const util = require('util');
const EventEmitter = require('events');
function MyStream() {
EventEmitter.call(this);
}
util.inherits(MyStream, EventEmitter);
MyStream.prototype.write = function(data) {
this.emit('data', data);
};
const stream = new MyStream();
console.log(stream instanceof EventEmitter); // true
console.log(MyStream.super_ === EventEmitter); // true
stream.on('data', (data) => {
console.log(`吸收的数据:"${data}"`);
});
stream.write('运作优越!'); // 吸收的数据:"运作优越!"
例子:运用 ES6 的 class 和 extends:
const EventEmitter = require('events');
class MyStream extends EventEmitter {
write(data) {
this.emit('data', data);
}
}
const stream = new MyStream();
stream.on('data', (data) => {
console.log(`吸收的数据:"${data}"`);
});
stream.write('运用 ES6');