我试图在属性上添加一个类decorator,并在instance中修改这个属性。
这在typescript中很好,但是我不想使用typescript,只使用babel,而不使用任何其他编译器。
我的猜测是,target在el函数中是class而不是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();发布于 2017-12-23 19:02:17
我最近遇到了一个similar problem。因此,我可以告诉您,在使用Babel时,您必须使用装饰器的PropertyDescriptor参数来获取初始值并设置属性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 };
}
}根据要求,我已经更新了您的装潢师,使之适用于just Babel。
getter方法中的附加setter调用是在类级别(构造函数或成员方法之外)初始化修饰属性时设置请求的返回值。
如果您希望它与TS兼容,则必须检查是否设置了PropertyDescriptor,而不是使用初始化器构造函数来获取初始值。将调用替换为
target[key]。
我不确定使用属性访问器返回新对象还是从装饰器方法返回初始PropertyDescriptor是最佳实践。它只是省略了每次调用修饰属性时都必须删除现有属性suchs作为value和writable。
https://stackoverflow.com/questions/47954698
复制相似问题