类装饰器(实例级别)

扎尔78

我正在尝试decorator在属性上添加类,并在中修改此属性instance

这可以很好地工作,typescript但是我不想使用typescriptbabel而不能使用任何其他编译器。

我的猜测是,函数target内部elclass而不是instance使用时不是这种情况typescript

如果有人对如何仅使用babel和不使用该工具有任何想法typescript

带打字稿的演示:https : //jsfiddle.net/w7xnwbdz/

仅使用Babel进行演示:https : //jsfiddle.net/w7xnwbdz/1/

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();
肖恩·范登·博加德

我最近遇到了类似的问题因此,我可以告诉您,使用Babel时,必须使用PropertyDescriptor装饰器参数来获取初始值并设置property accessors

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 };
    }
}

根据要求,我已经更新了你的装饰,使之成为工作只是巴贝尔。

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

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

我不确定是否最好的做法是仅使用属性访问器返回新对象,还是从decorator方法返回初始PropertyDescriptor。它只是忽略了声明具有如删除现有的性能suchsvaluewritable每次呼叫的装饰属性所做的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章