You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js类中如何通过方法入参动态调用this上的对应属性

问题解决方法

你的报错核心原因是:JavaScript 中使用this.exchangeName这种点语法访问属性时,会直接读取this上名为exchangeName的属性,而非将exchangeName作为变量、读取它的取值作为属性名。要动态通过变量值访问对象属性,必须使用方括号访问语法。
同时你当前的代码只存储了合约地址,还没有初始化合约实例,直接调用methods也会报错,需要同步补全构造函数逻辑。

具体修改步骤

  • 第一步:在构造函数中完成Uniswap合约实例的初始化,示例如下:
const UniswapFactoryABI = /* 替换为你的Uniswap Factory合约ABI */;
const UniswapRouterABI = /* 替换为你的Uniswap Router合约ABI */;

module.exports = class Registry {
  constructor(web3Instance) { // 建议传入已初始化的web3实例
    // 默认代币地址
    this.DAI = "0x6b175474e89094c44da98b954eedeac495271d0f";
    this.WETH = "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2";

    // 默认交易所合约地址
    this.UniswapFactoryAddress = "0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f";
    this.UniswapRouterAddress = "0xf164fC0Ec4E93095b804a4795bBe1e041497b92a";

    // 初始化合约实例,属性名和你后续传入的exchangeName参数对应
    this.uniswapFactoryContract = new web3Instance.eth.Contract(UniswapFactoryABI, this.UniswapFactoryAddress);
    this.uniswapRouterContract = new web3Instance.eth.Contract(UniswapRouterABI, this.UniswapRouterAddress);
  }
  • 第二步:修改动态访问合约实例的代码,把点语法换成方括号语法,可额外增加参数合法性校验,提前拦截非法参数:
// 已修正原方法名的拼写错误
  async getTokenPairAddress(addressToken0, addressToken1, exchangeName) {
    // 先校验传入的合约名是否存在
    if (!this[exchangeName]) {
      throw new Error(`不存在名为${exchangeName}的合约实例`);
    }
    // 用方括号动态读取对应合约实例
    const pairAddress = await this[exchangeName].methods.getPair(addressToken0, addressToken1).call();
    return pairAddress;
  }
}

调用示例

外部调用时按正常逻辑传参即可:

const Web3 = require('web3');
const Registry = require('./你的文件路径');

const web3 = new Web3('你的RPC节点地址');
const registry = new Registry(web3);
// 传入uniswapFactoryContract作为参数即可正常访问对应实例
const daiWethPair = await registry.getTokenPairAddress(registry.DAI, registry.WETH, 'uniswapFactoryContract');

内容的提问来源于stack exchange,提问作者Cian Darcy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 17:27:05