我最近开始学习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
答案 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
时不必使用括号。