gpt4 book ai didi

javascript - 如何修改类方法?

转载 作者:行者123 更新时间:2023-11-28 14:08:41 25 4
gpt4 key购买 nike

我的代码看起来像这样(简化)

class foo {
constructor() {
this.bar()
}

bar() {
// other code ...
console.log('original');
}
}

new foo(); // output: "original"

我希望在 bar() 方法中添加更多代码,而不影响已经存在的代码。

所以像这样

bar() {
// original code fires
// then...
console.log('new stuff');
}

最终的输出看起来像

original
new stuff

一些注意事项:

  1. 我不想重写 bar() - 我只想添加内容。
  2. 我不会调用 bar() - 它被称为上游,我只是想搭载该调用。
  3. 我一直在阅读有关 super 的内容但这似乎与子类(我不想创建)更相关

所以我想这就是我的问题:

是否可以按照我上面描述的方式添加到类方法的内容?

最佳答案

这几乎可以肯定是 XY problem ,但是你的问题的字面解决方案:

class Foo {
constructor() {
this.bar()
}

bar() {
// other code ...
console.log('original');
}
}

new Foo(); // output: "original"

const addedLine = 'console.log("new stuff");\n';
const source = Foo.prototype.bar.toString();
let [_, args, body] = source.match(/^.*?\((.*?)\)\s*{([^]*)}\s*$/);
body += addedLine;
args = args.split(/\s*,\s*/);
Foo.prototype.bar = Function(...args, body);

new Foo(); // output: "original", "new stuff"

警告: 这非常hacky!除了概念验证之外,您不应该考虑在生产代码中执行此操作。

一个不太hacky的解决方案,模仿super(并且比上面的黑魔法更受限制):

class Foo {
constructor() {
this.bar()
}

bar() {
// other code ...
console.log('original');
}
}

new Foo(); // output: "original"

(() => {
const oldBar = Foo.prototype.bar;
Foo.prototype.bar = function() {
oldBar.apply(this, arguments);
console.log("new stuff");
}
})();

new Foo(); // output: "original", "new stuff"

编辑:当类以小写字母开头时,它让我烦恼。

关于javascript - 如何修改类方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60333117/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com