如何解决javascript中不涉及重复函数名称的装饰器元编程
是否可以在 javascript 中编写一个不涉及两次输入名称的名称保留装饰器?我愿意在严格模式下使用 eval
,但不会在调用站点使用。
尝试做类似的事情:
@myDecorator
function myFuncWithANameICareAbout() {
...
}
有多种方法可以做到这一点。如果我在全局范围内这样做,我可以简单地做:
function makeDecorator(decoFunc) {
const decorator = function decorator(prewrappedFunc) {
const postwrappedFunc = decoFunc(prewrappedFunc);
window[prewrappedFunc.name] = postwrappedFunc;
return postwrappedFunc;
};
window['deco_'+decoFunc.name] = decorator;
}
makeDecorator(
function myDeco(func) {
console.log(`wrapping ${func.name}`);
return function(...args) {
//etc;
console.log(`calling ${func.name}(${args.map(JSON.stringify).join(',')})`);
return func(...args);
};
});
deco_myDeco(
function helloWorld() {
console.log('hello world!');
});
helloWorld();
// prints:
// wrapping helloWorld
// calling helloWorld()
// hello world!
如果我们在函数的范围内,我们无法执行 window[...] = etc
来定义函数,则会出现问题。我们不能依赖提升,因为函数表达式没有被提升!我们必须做这样的事情:
function someFunctionScope() {
const myHelloWorldFunctionWithANameICareAbout = myDeco2(function myHelloWorldFunctionWithANameICareAbout() {
// ...
});
}
因为我们不想做一些奇怪的事情,比如用原型继承扩展一个幻影 this
...而且我不相信没有像...这样的东西这是可能的。
function someFunctionScope() {
eval(myDeco2(function myHelloWorldFunctionWithANameICareAbout() {
}));
}
我们之后也不能添加 function helloWorld() {}.postProcessWithDeco(...)
因为这违反了 ecmascript 语法(即使它不是,它也会成为一个函数表达式)。所以我只是确认(除非 decorator proposal 被接受)这在 2021 年目前是不可能的?谢谢。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。