javascript - Nodejs/JavaScript 模块加载和引用

标签 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

最佳答案

我会尽量保持简洁,很多事情都有答案,但这里有很多。

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/

相关文章:

javascript - 用于编辑当前 URL 的书签

javascript - es6 箭头函数在转译为 javascript 后无法识别此运算符

javascript - 整数数组比较

javascript - Javascript 中匿名对象的缓存

javascript - 使用 lodash 在对象中查找属性的部分名称

angularjs - Angular $http.post 返回空错误

mysql - 从 node.js 在 redis 中查询

javascript - 期待这样或那样,如何在单元测试中包含 OR

javascript - 我调用函数位错误通知函数不是函数

javascript - 处理 GET 路由上的 POST 请求 (express.js)