我正在尝试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();
我最近遇到了类似的问题。因此,我可以告诉您,使用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。它只是忽略了声明具有如删除现有的性能suchsvalue
和writable
每次呼叫的装饰属性所做的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句