Nodejs / JavaScript模块加载和引用

时间:2018-03-25 00:04:46

标签: javascript node.js

我最近开始学习JavaScript和NodeJS。我不确定为什么我会看到不同的结果。如果有人能够解释导致不同输出的细微差别,我真的很感激。

var stream = require('stream');
var EventEmitter = require('events').EventEmitter; //typeof == function

console.log(new stream().Stream() instanceof EventEmitter); // error
console.log(new stream().Stream instanceof EventEmitter); // false
console.log(stream.Stream instanceof EventEmitter); // false...

console.log(new stream.Stream() instanceof EventEmitter); // true
console.log(new stream.Stream instanceof EventEmitter); // true

1 个答案:

答案 0 :(得分:1)

我会尽量保持简洁,很多这些东西都有答案,但这里有很多。

var EventEmitter = require('events').EventEmitter; //typeof == function

EventEmitter通常用于new。例如。 new EventEmitter()。在较旧的JavaScript中,您可以function Thing() { this.someprop = 2; }然后执行var a = new Thing()并且能够访问a.someprop。在ecmascript 6+中你可以使用class糖。无论如何。您可以new执行函数实现并获取函数的this。这个“实例”也应该在你的情况下将.constructor属性设置为EventEmitter函数,如果你要新建它。它还将.prototype设置为EventEmitter.prototype

console.log(new stream().Stream() instanceof EventEmitter); // error

这是错误的,因为Stream不是新流()上的属性。和Stream是undefined。访问/调用undefined或null属性将始终导致运行时错误。

console.log(new stream().Stream instanceof EventEmitter); // false

你应该做new stream() instanceof events.EventEmitter。再次,Stream是未定义的,不应该是任何事物的实例。请注意stream == stream.Stream;导出是Stream的快捷方式。

console.log(stream.Stream instanceof EventEmitter); // false...

构造函数本身只是一个函数,函数不是EventEmitter。

console.log(new stream.Stream() instanceof EventEmitter); // true

当你new函数时,返回的“实例”有一个原型,它是函数的原型。该原型可以反过来有一个原型,这是原型继承如何在JavaScript中工作。当您访问方法或属性时,JS walk会走动原型链寻找它。执行instanceof时,它只会检查原型链的级别以进行匹配。基本上,Stream在其原型链中的某个地方有EventEmitter。它实际上只是一个级别 - 翻译中的stream.prototype.__proto__会告诉你。

console.log(new stream.Stream instanceof EventEmitter); // true

stream === stream.Stream,使用new时不必使用括号。