javascript - 如何正确地将属性分配给函数作用域?

标签 javascript typescript typescript-decorator

我最近一直在尝试 Typescript Decorators,以尝试解决我的应用程序中遇到的“问题”。我正在使用 JS 桥将 TS 代码提供给 Android 和 iOS,目前我们声明如下函数:

index.js

import foo from './bar'

global.App = function() {
  this.foo = foo;
};

以上将使 foo 函数在桥的 native 端可用

我想编写一个装饰器来应用于该 foo 方法,该方法将在 global.App 上“注册”自身,但我在该任务中失败了。

这是有效的装饰器:

export const Task = (target, propertyKey, descriptor) => {
    let originalMethod = descriptor.value;
    descriptor.value = (...args) => originalMethod.apply(target, args);

    if (!global.App) {
        global.App = function () { 
            this.foo = descriptor.value;
        };
    }
    
    return descriptor;
}

如何向该 global.App 函数添加另一个方法?

最佳答案

首先,foo方法只添加一次,因为第一次调用装饰器 global.App定义并添加 foo 的分支至global.App永远不会重新输入。

其次,global.Appfoo每次都会被覆盖,并且不会通过重复调用装饰器来维护。

添加另一个分支,用于在第一次调用后处理添加方法并动态分配方法的名称,我相信该名称是在 propertyKey 中赋予装饰器的,将允许添加多种方法。

export const Task = (target, propertyKey, descriptor) => {
    let originalMethod = descriptor.value;
    descriptor.value = (...args) => originalMethod.apply(target, args);

    if (!global.App) {
        global.App = function () { 
            this[propertyKey] = descriptor.value;
        };
    } else {
        global.App[propertyKey] = descriptor.value;
    }
    
    return descriptor;
}

像这样的东西可能会起作用。

关于javascript - 如何正确地将属性分配给函数作用域?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70306679/

相关文章:

javascript - 需要时水平滚动列表居中

typescript - 嵌套索引类型导致 'cannot be used to index type' 错误

javascript - NestJS 的自定义路由装饰器

typescript - 在TypeScript中每次调用静态类方法时如何调用静态方法?

javascript - 为什么最后一个函数没有返回你毫无疑问

javascript - chrome 扩展 - 将消息从内容脚本发送到后台页面并返回到内容脚本?

javascript - 有没有办法在react-navigation(react-native)中保存和恢复导航历史记录

javascript - 在 Angular 中使用源映射生成生产版本 - CLI

typescript - 如何将值限制为对象的键?

javascript - 我可以在装饰器方法中获取变量的名称吗?