我使用的是带有typescrpit的VueJS,但它可以在任何js框架中使用。
我有一些带有一些方法的组件,我想要在全局范围内公开,这样它们就可以通过浏览器控制台使用。第一个想法是将它们附加到窗口对象。这可以通过生命周期方法来完成,比如我们安装在我的案例中,但我更喜欢使用装饰器来编写和使用更干净、更容易的解决方案。
我尝试过这样的方法:
mycomponenet.ts:
function makeGlobal() {
return function(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
(window as any)[propertyKey] = () => target[propertyKey]();
};
}
然后,这个装饰器将很容易使用,如下所示:
@makeGlobal()
myMethodToGoGloabl(){
// do stuff ...
}
到目前为止,一切都很好,直到函数使用"this"
:
@makeGlobal()
myMethodToGoGloabl(){
this.firstName = "";
}
然后我得到一个错误firstName为undefined。我通过搜索和阅读了解到装饰器是在类实例化之前执行的,因此我暴露的(如果我错了,请纠正我)是一个原型方法,而不是为什么我们无法访问它的实例的方法。我试图绑定(This),但失败的原因与我没有全局公开实例的方法一样。
有没有办法在我的例子中使用装饰器,或者它们在这里是没用的?
发布于 2019-12-30 14:51:42
我猜问题出在你的装饰者身上。你根本不需要接管这个实例...同样,你做的方式,你将不能传递参数。
建议:
function makeGlobal() {
return function(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
var currentThis = this;
(window as any)[propertyKey] = () => target[propertyKey].apply(currentThis, args);
};
}
还要记住Christian在评论中说的话。它基本上只能用于单例,因为它将覆盖多个实例的方法
https://stackoverflow.com/questions/59497916
复制相似问题