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

如何在同一函数中传入不同对象且无需修改内部字面量表达式?

无需修改函数内部代码,传入不同对象执行的解决方案

你的需求是点击不同按钮传入object1/object2执行person函数,但两个对象的姓名属性大小写不一致(一个是Name,一个是name),且不能改动person函数里的${name}、${age}写法。下面是具体实现方案:

1. 先做属性适配

因为两个对象的姓名属性命名不统一,先写个小函数把它们转换成函数能识别的格式:

// 适配对象属性,统一name字段的大小写
function adaptPerson(obj) {
  return {
    name: obj.name ?? obj.Name, // 优先取小写name,没有则用大写Name
    age: obj.age
  };
}

2. 绑定按钮事件执行函数

这里提供两种可行的方式,按需选择:

方式一:用with语句快速实现

通过with把适配后的对象作为临时作用域,让person函数里的变量直接读取对象属性:

// 给按钮1绑定点击事件,传入object1
document.querySelector('#btn1').addEventListener('click', () => {
  const adaptedObj = adaptPerson(object1);
  with(adaptedObj) {
    person();
  }
});

// 给按钮2绑定点击事件,传入object2
document.querySelector('#btn2').addEventListener('click', () => {
  const adaptedObj = adaptPerson(object2);
  with(adaptedObj) {
    person();
  }
});

注意:如果你的代码开启了ES5严格模式,with语句会被禁用,这种情况下建议用下面的方式。

方式二:临时挂载全局变量(无模式限制)

把适配后的属性临时放到全局作用域,执行完函数再恢复原全局变量,避免污染:

// 封装通用执行逻辑
function runPerson(obj) {
  const adaptedObj = adaptPerson(obj);
  // 保存原全局变量的值
  const oldName = window.name;
  const oldAge = window.age;
  // 替换成当前对象的属性
  window.name = adaptedObj.name;
  window.age = adaptedObj.age;
  // 执行目标函数
  person();
  // 恢复全局变量
  window.name = oldName;
  window.age = oldAge;
}

// 绑定按钮事件
document.querySelector('#btn1').addEventListener('click', () => runPerson(object1));
document.querySelector('#btn2').addEventListener('click', () => runPerson(object2));

内容的提问来源于stack exchange,提问作者Muralikumar J

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 14:36:16