javascript - 使用装饰器将类方法附加到窗口对象

标签 javascript typescript decorator

我正在将 VueJS 与 typescrpit 一起使用,但这可以在任何 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 of undefined。通过搜索和阅读,我了解到装饰器是在类实例化之前执行的,因此我暴露的(如果我错了,请纠正我)是原型(prototype)方法,而不是实例的方法,这就是为什么我们无法访问它。我尝试过绑定(bind)(this),但由于同样的原因我失败了,因为我没有全局公开实例的方法。

在我的情况下有没有办法使用装饰器,或者它们在这里毫无用处?

最佳答案

猜测问题出在你的装饰器上。你根本不接管这个实例...... 另外,按照您的方式,您将无法传递参数。

建议:

function makeGlobal() {
   return function(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
     var currentThis = this;
     (window as any)[propertyKey] = () => target[propertyKey].apply(currentThis, args);
   };
 }

还要记住克里斯蒂安在评论中所说的话。它基本上只能用于单例,因为它将重写多个实例的方法

关于javascript - 使用装饰器将类方法附加到窗口对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59497916/

相关文章:

angular - 服务相互包含时访问静态属性时出错

javascript - 在 nest.js 中,是否可以在参数装饰器中获取服务实例?

javascript - jQuery Validate - 将错误类添加到父 Div

javascript - typescript中数组的两种写法有什么区别

typescript - 我应该更喜欢命名空间还是带有静态函数的类?

c - 如何在c中的另一个函数之前和之后执行公共(public)代码?

php - 为包装类操作 PHP-instanceof-operator

javascript - Chocolat.js Lightbox jQuery 未检测到元素,返回未定义

javascript - Jquery搜索不是一个函数

javascript - 重新排列图 block