我最近开始学习 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
最佳答案
我会尽量保持简洁,很多事情都有答案,但这里有很多。
var EventEmitter = require('events').EventEmitter; //typeof == function
EventEmitter 是您通常与 new
一起使用的东西。例如。 新的 EventEmitter()
。在旧的 javascript 中你可能会做 function Thing() { this.someprop = 2; }
然后执行 var a = new Thing()
并能够访问 a.someprop
。在 ecmascript 6+ 中,您可以使用 class
糖。无论如何。您可以新建
函数实现并获取函数的this
。这个“实例”还应该将 .constructor
属性设置为您的情况下的 EventEmitter 函数,如果您要更新它的话。它还会将 .prototype 设置为 EventEmitter.prototype
console.log(new stream().Stream() instanceof EventEmitter); // error
这是错误的,因为 Stream 不是 new 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...
构造函数本身只是一个函数,函数不是事件发射器。
console.log(new stream.Stream() instanceof EventEmitter); // true
当您新建
一个函数时,返回的“实例”有一个原型(prototype),它是函数的原型(prototype)。该原型(prototype)又可以有一个原型(prototype),这就是原型(prototype)继承在 javascript 中的工作方式。当你访问一个方法或属性时,JS walk 遍历原型(prototype)链寻找它。当您执行 instanceof
时,它只是检查原型(prototype)链的级别是否匹配。基本上,Stream 的原型(prototype)链中某处有 EventEmitter。它实际上只是高出一个级别 - repl 中的 stream.prototype.__proto__
会告诉你。
console.log(new stream.Stream instanceof EventEmitter); // true
stream === stream.Stream
,并且在使用new
时不必使用括号。
关于javascript - Nodejs/JavaScript 模块加载和引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49471238/