如何在JavaScript中复制函数并修改硬编码字符串且不改动原函数?
当然可行!两种实用方案任你选
方案1:重构myMethod1为可配置函数(首推,同步性拉满)
既然你不想改动myMethod1的原有功能,但又希望myMethod2能自动同步它的逻辑变化,最稳妥的方式是把myMethod1里的可变部分(也就是那个'foo'前缀)抽成参数,搞个通用的基础函数出来。这样myMethod1和myMethod2都基于这个基础函数实现,不管myMethod1里的a、b怎么改,myMethod2都会自动跟上。
举个具体的例子:
// 先把核心逻辑抽成通用的基础方法 const baseMethod = (prefix) => { const a = 1; const b = 2; // 之后要是改成CHANGE,直接在这儿改一次就行 return callsAnotherFunction(`${prefix}: ${a + b} $`); }; // 原来的myMethod1完全保留原有功能 const myMethod1 = () => baseMethod('foo'); // 新的myMethod2只需要传个不同的前缀就行 const myMethod2 = () => baseMethod('bar');
这么做的好处太多了:
- 完全不破坏myMethod1原来的行为
- 以后myMethod1的实现变了(比如把
b换成const b = 'CHANGE'),只需要改baseMethod,myMethod1和myMethod2都会自动适配这个变化 - 后续要加其他前缀的方法也超方便,直接调用baseMethod传新前缀就行
方案2:完全不碰myMethod1的包装方案(有局限性)
如果因为某些限制完全不能修改myMethod1的代码,那也可以通过包装它的返回值来替换字符串。不过这种方式有个前提:myMethod1返回的字符串里,'foo'这个标识不会和其他内容混在一起。
示例代码是这样的:
const myMethod2 = () => { const originalResult = myMethod1(); // 把返回结果里的'foo'替换成'bar' return originalResult.replace('foo', 'bar'); };
但要注意这种方式的局限性:
- 如果myMethod1的返回内容里有其他地方出现'foo'(比如
callsAnotherFunction内部生成的文本也带'foo'),会被误替换 - 要是myMethod1的拼接逻辑变了(比如改成
foo-${a+b}而不是foo: ${a+b}),只要'foo'这个前缀还在,替换依然有效;但如果前缀格式彻底变了(比如变成FOO: ${a+b}),就得修改replace的规则了
总结
优先选第一种方案,它能完美满足你“同步myMethod1变更”的需求,代码结构也更清晰好维护。
内容的提问来源于stack exchange,提问作者chitzui
相关产品推荐
相关产品推荐

