我正在研究这个Streams article中的NodeJS流代码和这个示例
const { Readable } = require('stream');
const inStream = new Readable({
read() {}
});
inStream.push('ABCDEFGHIJKLM');
inStream.push('NOPQRSTUVWXYZ');
inStream.push(null); // No more data
inStream.pipe(process.stdout);
当我进入new Readable()
调用时,我看到的代码如下所示:
const Stream = require('stream');
function Readable(options) {
// ...
Stream.call(this);
}
Stream.call(this)
是做什么的?我以前没见过这样的代码。
我知道Javascript Object.call()方法是做什么的,通常在另一个函数中见过它。
myObj.myFunc.call(this);
我阅读了MDN https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/call,示例代码将两个对象组合在一起。
因此,我相信在调用Readable
Stream.call(this)
之后的对象具有所有的流函数和字段值。
这样正确吗?
我猜这就是Javascript实现类似继承的功能的方式,但没有继承。我认为这真的相当于合并多个Javascript对象。
因此,为了证明我的理解,我编写了一个JSFiddle code example,其中显示了三个函数fun1、fun2和fun3,并让MyMultiObj调用它们,如下所示:
function MyMultiObj() {
fun1.call(this);
fun2.call(this);
fun3.call(this);
}
let myMulti = new MyMultiObj();
在这段代码中,myMulti
对象具有4个函数MyMultiObj、fun1、fun2和fun3的所有功能和字段。
我还注意到通过原型定义的功能(例如,fun2.prototype.really2()
没有合并/可用,这是有意义的,因为这种方法没有使用原型)。
我认为这很酷,可以看到它的好处,但我想
Stream.call(this)
之后的Readable
对象具有所有流函数和字段值,发布于 2018-10-29 05:29:47
使用call()
只是执行一个函数,this
是传递给它的对象,在构造函数中,它就像其他语言(和ES6)中的super()
调用:
function Stream() {
this.something = 1;
}
function Readable () {
Stream.call(this);
}
(new Readable()).something // 1
等于:
class Stream {
constructor() {
this.something = 1;
}
}
class Stream extends Readable {
constructor() {
super(); // <<
}
}
所以我相信调用Stream.call(
)之后的可读对象拥有所有的流函数和字段值。
只有那些直接在构造函数中设置的。它没有原型的值/方法
https://stackoverflow.com/questions/53036208
复制相似问题