Javascript 通过类装饰器自动将类添加到列表中?
有可能在装饰器中获得“类对象”(构造函数)的句柄吗 背景:我想用带有类型标记的字符串值解析json格式,例如Javascript 通过类装饰器自动将类添加到列表中?,javascript,decorator,Javascript,Decorator,有可能在装饰器中获得“类对象”(构造函数)的句柄吗 背景:我想用带有类型标记的字符串值解析json格式,例如“@date:2019-01-25”或“@latlong:51.507351,-0127758” 这是旧js库的现代化工作,在旧js库中,这是通过重写子类化和实例创建来实现的 装饰器看起来很有前途,至少我可以将标记定义为类属性: function dkdatatype({tag}) { return function decorator(cls) { if (cls
“@date:2019-01-25”
或“@latlong:51.507351,-0127758”
这是旧js库的现代化工作,在旧js库中,这是通过重写子类化和实例创建来实现的
装饰器看起来很有前途,至少我可以将标记定义为类属性:
function dkdatatype({tag}) {
return function decorator(cls) {
if (cls.kind !== 'class') throw `not class ${cls.kind}`;
cls.elements.push({
kind: 'field',
key: 'tag',
placement: 'static',
descriptor: {
configurable: false,
enumerable: true,
writable: false
},
initializer: () => tag
});
return {
kind: 'class',
elements: cls.elements
};
};
}
@dkdatatype({tag: '@date:'})
export class DkDate extends datatype {
constructor(...args) {
super();
const clstag = this.constructor.tag;
if (typeof args[0] === 'string' && args[0].startsWith(clstag)) {
this.value = new Date(args[0].substr(clstag.length));
} else {
this.value = new Date(...args);
}
}
toJSON() {
return this.constructor.tag + this.value.toISOString().slice(0, 10);
}
}
我可以手动将该类添加到类型注册表:
type_registry[DkDate.tag] = DkDate
但是有没有任何方法可以从decorator(或者基类,或者其他一些方法)自动(并且仅一次)执行此操作呢?根据,您希望向decorator返回的类描述符添加一个extras
属性,该类描述符应该包含一个“钩子”描述符,该描述符应该有一个finish
方法,一旦类被完全定义,该方法将作为参数与类一起调用
下面是示例代码:
function defineElement(tagName) {
return function(classDescriptor) {
let { kind, elements } = classDescriptor;
assert(kind == "class");
return {
kind,
elements,
// This callback is called once the class is otherwise fully defined
extras: [
{
kind: "hook",
placement: "static",
finish(klass) {
window.customElements.define(tagName, klass);
}
}
]
};
};
在您的情况下,extras
将如下所示:
extras: [
{
kind: "hook",
placement: "static",
finish(klass) {
type_registry[tag] = klass;
},
},
],
使用
@babel/plugin-proposal-decorators
7.3.0,我得到了TypeError:类描述符不能有.extras属性。
经过多次搜索,我找到了这个(),并添加了finisher(cls){type_-registry[tag]=cls;}
而不是extras:..
似乎可以工作(即使它已从中的文档中删除)。我想这就是最前沿的生活……看起来它现在正在进行中:挖掘得好。