首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用TypeScript解码器创建属性getter和setter

使用TypeScript解码器创建属性getter和setter
EN

Stack Overflow用户
提问于 2018-04-17 12:09:20
回答 2查看 4K关注 0票数 5

我想用TypeScript装饰器创建一个属性getter和setter,但是当属性被更改或请求时,我不得不定义要运行的函数。

如果我的Field.watch装饰器有以下用法:

代码语言:javascript
运行
复制
export class Test {
   ...
   @Field.watch({onSet: this.resetCssCache})
   public layoutId = 0;
   ...
   public resetCssCache() {
      ...
   }
   ...
}

而装饰者的实现是:

代码语言:javascript
运行
复制
export class Field {

    public static watch(watchers: { onGet?: () => any, onSet?: (newValue: any, oldValue: any) => any }): Function {
        return (target: any, key: string) => {

            // property getter
            const getter = function() {
                return this['_' + key];
            };

            // property setter
            const setter = function(newVal) {
                if (watchers.onSet) {
                    this['_' + key] = watchers.onSet(newVal, this['_' + key]);
                }
                this['_' + key] = newVal;
            };

            // Delete property.
            if (delete this[key]) {

                // Create new property with getter and setter
                Object.defineProperty(target, key, {
                    get: getter,
                    set: setter,
                    enumerable: true,
                    configurable: true
                });
            }
        }
    }
}

我在@Field.watch({onSet: this.resetCssCache})上看到一个错误,告诉我this没有定义。

我想装饰器是在定义级别而不是在实例级别上解释的。是否有方法将非静态方法绑定到我的装饰器的onSet属性?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-04-17 12:37:50

不能通过装饰器内部的this访问方法,可以使用prototype传递该方法

代码语言:javascript
运行
复制
export class Test {

    @Field.watch({onSet: Test.prototype.resetCssCache })
    public layoutId = 0;

    public resetCssCache() {

    }

}

请注意,这意味着当您调用watchers.onSet(newVal, this['_' + key]);时,resetCssCache内部的this实际上将是watchers而不是Test的实例。应该使用call调用它,这样就可以显式地传递this watchers.onSet.call(this, newVal, this['_' + key])

票数 3
EN

Stack Overflow用户

发布于 2018-04-17 12:31:48

你对“这”代表什么的假设是不正确的。就像你在问题的最后一句中指出的那样,你似乎在寻找实例级的装饰师。

我过去也有类似的需求,这个问题提供了答案。

这个问题还提供了一个解决方案。

祝你好运!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49877756

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档