Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在使用非遗留装饰器时装饰JavaScript类构造函数?_Javascript_Javascript Decorators - Fatal编程技术网

如何在使用非遗留装饰器时装饰JavaScript类构造函数?

如何在使用非遗留装饰器时装饰JavaScript类构造函数?,javascript,javascript-decorators,Javascript,Javascript Decorators,我有以下课程: @log 课例{ 建造师(姓名、年龄){ log(“示例构造函数”、名称、年龄); this.name=名称; 这个。年龄=年龄; } } 使用旧式装饰器时,此@log装饰器: @log class Example { constructor(name, age) { console.log("Example constructor", name, age); this.name = name; this.age = age;

我有以下课程:

@log
课例{
建造师(姓名、年龄){
log(“示例构造函数”、名称、年龄);
this.name=名称;
这个。年龄=年龄;
}
}
使用旧式装饰器时,此
@log
装饰器:

@log
class Example {
  constructor(name, age) {
    console.log("Example constructor", name, age);
    this.name = name;
    this.age = age;
  }
}

const example = new Example("Graham", 34);

函数日志(类){
返回类扩展了类{
构造函数(…参数){
console.log(“log”,args);
超级(…args);
}
};
}
/.babelrc
// ...
“插件”:[
[“@babel/plugin提案装饰器”,{“legacy:true}],
// ...
]
// ...
上述设置工作正常,代码如下:

const-example=新示例(“格雷厄姆”,34);
产出:

log (2) ["Graham", 34]
Example constructor Graham 34
log (2) ["Graham", 34]
Example constructor Graham 34
现在,我如何在使用非传统装饰器时获得相同的结果,即:

/.babelrc
// ...
“插件”:[
[
“@babel/plugin提案装饰器”,
{“decororsBeforeExport”:false}
],
// ...
]
// ...
如何实现
@log
,使其与旧式装饰器的工作方式相同

函数日志(…args){
常量[描述符]=参数;
常量{kind,elements}=描述符;
常量newElements=elements.concat({
种类:“方法”,
位置:“原型”,
密钥:“构造函数”,
描述符:{
值:(…参数)=>{
//我已经试过了,但是不起作用。。。
console.log(“log”,args);
},
对,,
可写:对,
可枚举:正确,
},
});
返回{
友善的
元素:新元素,
};
}
我已经尝试了上面的代码,但没有成功。问题是,在使用非遗留装饰器时,我没有对目标的引用。你知道有没有一种方法可以达到与遗留产品相同的行为


谢谢。

我找到了答案,多亏了网上的loganfsmyth

必须返回一个对象,该对象的属性名为
finisher
包装类,例如:

函数日志(…args){
常量[描述符]=参数;
常量{kind,elements}=描述符;
返回{
友善的
元素,
完成者:(类别)=>{
返回类扩展了类{
构造函数(…参数){
console.log(“log”,args);
超级(…args);
}
};
}
};
}
然后,在使用非旧式装饰器时,执行以下代码:

@log
class Example {
  constructor(name, age) {
    console.log("Example constructor", name, age);
    this.name = name;
    this.age = age;
  }
}

const example = new Example("Graham", 34);

产出:

log (2) ["Graham", 34]
Example constructor Graham 34
log (2) ["Graham", 34]
Example constructor Graham 34
与传统装饰一样


很难找到答案,因为上没有记录非遗留装饰程序的此功能。

您所说的“引用目标”是什么意思?请注意,您不能将箭头函数用作构造函数。
对目标的引用
:当我使用旧式装饰器时,我会得到一个
目标
参数,它是我正在装饰的类(
在我的示例中是class
)。然后,我可以返回一个
类扩展类{}
并像我以前的decorators示例那样包装/修饰原始构造函数。但是,当我收到的参数是一个
描述符
对象,且
常量{kind,elements}=descriptor时,如何使用非遗留装饰器实现同样的效果?非常感谢。这不是还在吗?对于当前的提案,我认为您正在寻找旧提案是否已被否决?还是仍在建设中?您如何将
@wrap
@log
结合使用,以获得与旧式装饰器相同的效果?我基本上需要在
之前执行一些操作,在示例的修饰构造函数之后执行一些操作,甚至可能返回一个与新示例完全不同的实例,即不调用超级,所有这些当我在非传统模式下使用
@log
时…@Bergi我发现非传统装饰器有一个叫做
finisher
的东西:
它们还可以创建附加属性并定义一个在装饰类上运行的函数(finisher)
你知道如何使用这个finisher函数吗?我找不到API。