首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >类装饰器(实例级)

类装饰器(实例级)
EN

Stack Overflow用户
提问于 2017-12-23 17:54:44
回答 1查看 741关注 0票数 1

我试图在属性上添加一个类decorator,并在instance中修改这个属性。

这在typescript中很好,但是我不想使用typescript,只使用babel,而不使用任何其他编译器。

我的猜测是,targetel函数中是class而不是instance,而在使用typescript时并非如此。

如果有人知道如何使用babel和不使用typescript来完成这项工作

带类型记录的演示:https://jsfiddle.net/w7xnwbdz/

仅限babel演示:https://jsfiddle.net/w7xnwbdz/1/

代码语言:javascript
复制
function el(type) {
  return function descriptor(target, key,dec) {

    let value = target[key];
     const getter = function() {

      return value;
    };

    const setter = function(newVal) { 
      value = document.createElement(type);
      value.innerHTML = newVal
    };

    if (delete target[key]) {
      Object.defineProperty(target, key, {
        get: getter,
        set: setter,
        enumerable: true,
        configurable: true
      });
    }
  }
}


class App { 

  @el("div")
  logo = "message"

  constructor() {
    console.log(this.logo)
  }
}

let app = new App();
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-23 19:02:17

我最近遇到了一个similar problem。因此,我可以告诉您,在使用Babel时,您必须使用装饰器的PropertyDescriptor参数来获取初始值并设置属性accessors

代码语言:javascript
复制
function el(type) {
    return function descriptor(target, key, dec) {
        const { initializer } = dec;

        let value = target[key] || null;

        const getter = function () {
            console.log('_getter_')

            if (!value && (value = initializer.call(this))) {
                setter(value);
            }
            return value;
        };

        const setter = function (newVal) {
            console.log('_setter_');

            value = document.createElement(type);
            value.innerHTML = newVal
        };

        return { get: getter, set: setter };
    }
}

根据要求,我已经更新了您的装潢师,使之适用于just Babel。

getter方法中的附加setter调用是在类级别(构造函数或成员方法之外)初始化修饰属性时设置请求的返回值。

如果您希望它与TS兼容,则必须检查是否设置了PropertyDescriptor,而不是使用初始化器构造函数来获取初始值。将调用替换为target[key]

我不确定使用属性访问器返回新对象还是从装饰器方法返回初始PropertyDescriptor是最佳实践。它只是省略了每次调用修饰属性时都必须删除现有属性suchs作为valuewritable

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

https://stackoverflow.com/questions/47954698

复制
相关文章

相似问题

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