【渗入】node.js典范题目

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');


    原文作者:Web寻梦狮
    原文地址: https://segmentfault.com/a/1190000015554443
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞