Javascript node/js es6“;“类”;从函数继承原型(链)

Javascript node/js es6“;“类”;从函数继承原型(链),javascript,class,inheritance,stream,Javascript,Class,Inheritance,Stream,是否可以从es6类定义中的函数中删除原型链 const{PassThrough}=require(“流”); 常量双工器=需要(“双工器3”); 类接口{ 构造函数(obj,选项){ 选项=Object.assign({ 解码字符串:false, 自动关闭:错误, objectMode:true },选项); let reader=新的直通(选项); let writer=新传递(选项); //使用双工流作为原型 这=双工器(选项、读卡器、写卡器); 分配(本,obj); }; }; const

是否可以从es6类定义中的函数中删除原型链

const{PassThrough}=require(“流”);
常量双工器=需要(“双工器3”);
类接口{
构造函数(obj,选项){
选项=Object.assign({
解码字符串:false,
自动关闭:错误,
objectMode:true
},选项);
let reader=新的直通(选项);
let writer=新传递(选项);
//使用双工流作为原型
这=双工器(选项、读卡器、写卡器);
分配(本,obj);
};
};
const iface=新接口({
_id:“60891a02256c0c7931395c48”,
设置:{
端口:8080,
主持人:“127.0.0.1”
}
});
this=双工器(选项、读卡器、写卡器);
给我一个错误:

        this = duplexer(options, reader, writer);
        ^^^^

SyntaxError: Invalid left-hand side in assignment
    at Object.compileFunction (vm.js:344:18)
    at wrapSafe (internal/modules/cjs/loader.js:1048:15)
    at Module._compile (internal/modules/cjs/loader.js:1082:27)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1138:10)
    at Module.load (internal/modules/cjs/loader.js:982:32)
    at Function.Module._load (internal/modules/cjs/loader.js:875:14)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:71:12)
    at internal/main/run_main_module.js:17:47
如果我使用,
extends
&
super
,它可以工作,但是我在接口对象上有双工器流的属性,但是我想“隐藏”它们,在原型链的上面

类接口扩展双工器{
构造函数(obj,选项){
选项=Object.assign({
解码字符串:false,
自动关闭:错误,
objectMode:true
},选项);
let reader=新的直通(选项);
let writer=新传递(选项);
超级(选项、读卡器、写卡器)
分配(本,obj);
};
};
不确定,如果这是可能的,或者我理解它是正确的,但是当我从其他类/对象中删除一些属性时,它们“停留”在其原始对象范围内,当我想要访问它们时,引擎向上“查找”,直到找到一个属性,如果没有,则其
未定义

我的目标是拥有干净的“Interace”对象实例,将属性传递给consctrutor,并且仍然能够使用node.js流特定的方法(读/写/等等)

谢谢你的帮助

编辑:我找到了一个使用代理对象的解决方案:

类根目录{
构造函数(){
this.root=true;
}
rootMethod(){
log(“我是根”);
}
}
类父级扩展根{
构造函数(){
超级();
this.parent=true;
}
父方法(){
console.log(“我是父母”);
}
}
类子级扩展父级{
构造函数(){
超级();
这个孩子是真的;
}
childMethod(){
console.log(“我是孩子”)
}
}
类接口{
构造函数(){
此参数。设置={
主持人:“0.0.0.0”,
端口:8030
}
}
}
常量根=新根();
const parent=新父级();
const child=new child();
const iface=新接口();
const proxy=新代理(子{
获取:函数(目标、道具){
如果(目标[道具]){
返回目标[道具];
}否则{
返回iface[道具];
}
}
});
//log(root,root.rootMethod);
//console.log(parent,parent.parentMethod);
//log(child,child.childMethod);
console.log(proxy.settings、proxy.rootMethod)

这将检查代理对象上是否存在属性,如果不存在,请尝试访问隐藏对象上的属性。

这是肯定的。您只需要修改子类原型的原型,就可以了

查看代码:

类接口{}
Object.setPrototypeOf(Interface.prototype,Duplex.prototype)
const instance=新接口
//您可以从双工调用方法
instance.someMethodFromDuplex()

更喜欢组合而不是继承-只要有一个
#duplex
成员并将流接口委托给它就行了?(或者最好使用异步迭代器:D)@BenjaminGruenbaum谢谢你的回复。你能给我一个“合成”的描述/链接/例子吗?我第一次听到它。。。这看起来很简单,但我想不出来,这让我发疯。我理解这个概念,但我不能在解决问题的地方编写代码。我所得到的只是“接口”范围被父/双工器方法/属性污染了。。。是我能做的最接近的,但是这里是显示在
控制台.log中的类名“Stream”,这不是很好。。。我不明白,在普通的js对象中,它也起作用了…@BenjaminGruenbaum你觉得我的代理对象解决方案怎么样?你能给我一个“工作”的例子吗?我必须将参数传递给
双工器
函数。这不是node.js内部的“双工”流。我对你的代码片段理解不够,无法按我需要的方式扩展它。这里的原型链:就是我所说的。我想要“继承-ES5方式”的结果,但是使用我代码片段中的双工器方法,事实上,extends关键字exaclty满足了您的需求。但是我看到您想要对双工器“隐藏”属性,这个要求看起来有点不寻常。那有什么必要的原因?也许我们可以找到另一种方法。接口实例(带有它的属性)应该通过API发送并显示在前端,当作用域中充斥着来自超级/父类的属性时,它会变得凌乱而不干净。我的意思是,它也适用于标准的js对象/函数。。。看看这里:这很接近,但正如您在控制台中看到的。log
它说它是一个“流”对象,而不是我的“接口”对象,有没有办法“更改”显示的名称?根据您描述的情况,我确实认为更好的方法是,您可以实现一个类的函数,该函数返回一个显式包含您希望通过API发送的内容的对象,然后使用该函数的返回值,而不是将整个实例传递给AJAX方法。这种方式非常清晰,并且是声明性的。顺便说一下,在snippet console.log中显示了一个接口对象,这显然是正确的结果。在node中,它显示了一个“流”对象