JavaScript中如何通过函数参数调用Web3合约实例的指定方法
问题:通过函数参数调用实例的指定方法
我有如下异步函数:
async function estimateGas() { const w3 = await new Web3(window.ethereum); window.contract = await new w3.eth.Contract(myContr.abi, myContr.addr); window.contract.methods.buy().estimateGas({from: ethereum.selectedAddress}); }
我希望修改该函数,使其能够随意调用实例中的任意方法,示例如下:
async function estimateGas(argumentName) { const w3 = await new Web3(window.ethereum); window.contract = await new w3.eth.Contract(myContr.abi, myContr.addr); // 我想用传入的参数替代原本的".buy()",实现类似".argumentName()"的调用 window.contract.methods.argumentName().estimateGas({from: ethereum.selectedAddress}); }
请问在JavaScript中,如何通过函数参数调用函数内部创建的实例的指定方法?
解决方案
在JavaScript中,用变量访问对象的属性/方法时,不能用.点语法(点语法只识别字面量属性名),必须使用方括号[]语法,它支持用变量作为属性名来动态访问。
修改后的基础版函数如下:
async function estimateGas(methodName) { const w3 = await new Web3(window.ethereum); window.contract = await new w3.eth.Contract(myContr.abi, myContr.addr); // 用方括号语法通过变量调用指定方法 return window.contract.methods[methodName]().estimateGas({from: ethereum.selectedAddress}); }
扩展优化:支持传递方法参数
如果合约方法需要传入参数(比如buy(tokenId, amount)),可以扩展函数接收方法参数:
async function estimateGas(methodName, ...methodArgs) { const w3 = await new Web3(window.ethereum); window.contract = await new w3.eth.Contract(myContr.abi, myContr.addr); // 解构传入的参数并传递给合约方法 return window.contract.methods[methodName](...methodArgs).estimateGas({from: ethereum.selectedAddress}); }
实用注意事项
- 要确保传入的
methodName是合约ABI中存在的方法名,否则会抛出错误。可以添加简单校验:if (!window.contract.methods[methodName]) { throw new Error(`合约中不存在方法:${methodName}`); } - 记得返回
estimateGas的Promise结果,这样调用方可以通过await获取最终的Gas估算值。
内容的提问来源于stack exchange,提问作者Pro Girl
相关产品推荐
相关产品推荐

