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

如何重写JS对象默认getter运算符以自动添加属性前缀?

实现自动添加前缀的对象属性访问

假设我的JavaScript代码中有如下对象:

var myData = {
  "someWeirdPrefix_name": "John Doe",
  "someWeirdPrefix_age": 24,
  ...
}

是否可以重写默认的getter运算符(.),使得编写myData.name时能自动获取到"John Doe"?即让属性获取时自动为给定键添加指定前缀,再获取对应值。已知可以直接清理数据移除前缀,但不符合使用场景,需要对所有属性实现该功能,而非仅name和age。

解决方案

方法一:使用ES6 Proxy(推荐)

Proxy可以拦截对象的属性访问操作,批量实现自动前缀拼接逻辑,无需修改原对象,后续新增的带前缀属性也能自动生效。

const myData = {
  "someWeirdPrefix_name": "John Doe",
  "someWeirdPrefix_age": 24
};

const prefix = "someWeirdPrefix_";
const proxyData = new Proxy(myData, {
  get(target, prop) {
    // 拼接前缀,优先查找带前缀的属性
    const prefixedProp = `${prefix}${prop}`;
    return prefixedProp in target ? target[prefixedProp] : target[prop];
  }
});

// 测试访问
console.log(proxyData.name); // 输出 "John Doe"
console.log(proxyData.age); // 输出 24
// 原对象的无前缀属性也能正常访问
myData.gender = "male";
console.log(proxyData.gender); // 输出 "male"

方法二:使用Object.defineProperty(兼容旧环境)

如果需要兼容不支持Proxy的旧环境,可以遍历原对象属性,手动为包装对象添加无前缀的getter。这种方式仅对当前已存在的带前缀属性生效,后续新增属性需要手动处理。

const myData = {
  "someWeirdPrefix_name": "John Doe",
  "someWeirdPrefix_age": 24
};

const prefix = "someWeirdPrefix_";
const wrapper = {};

// 遍历原对象的带前缀属性,为wrapper添加对应getter
Object.keys(myData).forEach(key => {
  if (key.startsWith(prefix)) {
    const propName = key.slice(prefix.length);
    Object.defineProperty(wrapper, propName, {
      get() {
        return myData[key];
      },
      enumerable: true // 让属性可被枚举(如for...in遍历)
    });
  }
});

// 测试访问
console.log(wrapper.name); // 输出 "John Doe"
console.log(wrapper.age); // 输出 24

注意事项

  • Proxy方式不会修改原对象,所有访问逻辑通过代理层处理,更灵活且无副作用。
  • Object.defineProperty方式需要提前遍历属性,后续新增的带前缀属性需要手动调用相同逻辑添加getter。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 04:06:26